Android 之json解析2

JSON(JavaScript Object Notation) 定义:字符串 键值对 解析方法有JSON,谷歌GSON,阿里巴巴FastJSON

一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。

业内主流技术为其提供了完整的解决方案(有点类似于正则表达式,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换。

JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。

Json建构于两种结构:

1.“名称/值”对的集合(A collection of name/value pairs):不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。

ØJSON对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。

每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。如: {“name”:”jackson”, “age”:100}

2.值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)

Ø数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔

如:{  “students”:  [  {“name”:”jackson”,“age”:100},  {“name”:”michael”,”age”:51}  ]  }

JSON解析JSON数据时的重要方法

(1)JSONObject:

这是系统中有关JSON定义的基本单元,其包含一对(Key/Value)数值。

它对外部(External:应用toString()方法输出的数值)调用的响应体现为一个标准的字符串(例如:{“JSON”: “Hello, World”},最外被大括号包裹,其中的Key和Value被冒号”:”分隔)。

其对于内部(Internal)行为的操作格式略微,例如:初始化一个JSONObject实例,引用内部的put()方法添加数值:new JSONObject().put(“JSON”, “Hello, World!”),在Key和Value之间是以逗号”,”分隔。

Value的类型包括:Boolean、JSONArray、JSONObject、Number、String或者默认值JSONObject.NULL object。

有两个不同的取值方法:

get(): 在确定数值存在的条件下使用,否则当无法检索到相关Key时,将会抛出一个Exception信息。

opt(): 这个方法相对比较灵活,当无法获取所指定数值时,将会返回一个默认数值,并不会抛出异常。

(2)JSONArray:

它代表一组有序的数值。将其转换为String输出(toString)所表现的形式是用方括号包裹,数值以逗号”,”分隔(例如:[value1,value2,value3],大家可以亲自利用简短的代码更加直观的了解其格式)。这个类的内部同样具有查询行为,get()和opt()两种方法都可以通过index索引返回指定的数值,put()方法用来添加或者替换数值。

同样这个类的value类型可以包括:Boolean、JSONArray、JSONObject、Number、String或者默认值JSONObject.NULL object。

示例:服务器端生成json数据,客户端读取并解析json数据

(3)JSONStringer:

根据官方的解释,这个类可以帮助快速和便捷的创建JSONtext。其最大的优点在于可以减少由于格式的错误导致程序异常,引用这个类可以自动严格按照JSON语法规则(syntaxrules)创建JSON text。每个JSONStringer实体只能对应创建一个JSON text。

根据下边的实例来了解其它相关信息:String myString = new JSONStringer().object() .key("name").value("小猪") .endObject().toString();

String myString = new JSONStringer().object()

.key("name")

.value("小猪")

.endObject()

.toString();
结果是一组标准格式的JSON text:{"name" : "小猪"}

其中的.object()和.endObject()必须同时使用,是为了按照Object标准给数值添加边界。同样,针对数组也有一组标准的方法来生成边界.array()和.endArray()。

示例1:

服务器端编写

1.首先导入json的各种包

2.JsonTools  如何将不同的数据类型如何生成json格式的字符串

3.JsonService  将person对象返回不同数据类型,供JsonTools  生成json

person

JsonService

4.TestJson 测试JsonTools  是否可以正常将JsonService 中返回的各种类型转换成json格式的字符串

5.JsonAction servlet 响应客户端的action  首先实例化JsonService 对象 并在init()方法中初始化该对象  doget做dopost的内容,并完善dopost

客户端编写

1.首先在清单文件中添加访问网络的授权

2.修改布局文件

3.为了访问服务器端数据,编写http工具类,将访问url返回的输入流转换成String返回

4.由于服务器端是将person对象按照不同的格式加工成json格式的字符串返回给客户端,而客户端需要将字符串解析出来还原成为一个相应格式的person对象,所以客户端也需要定义一个person类

5.重点编写json解析类JsonTools,完成解析,要求给方法一个key和一个json字符串,就按照要求还原出来

---------------------------------------

谷歌GSON技术

Gson这个Java类库可以把Java对象转换成JSON,也可以把JSON字符串转换成一个相等的Java对象。

Gson支持任意复杂Java对象包括没有源代码的对象。

示例2:

服务器端:在上例中修改部分代码

1.导入包

2.修改JsonTools  去掉key

3.JsonService  不变

4.修改action 因为gson的方法没有key值,所以得去掉

就这样 修改就完成了

客户端编写:

1.首先还是网络授权、并导入第三包

2.布局文件添加按钮

3.http、person同上

4.gsonTools 由于服务器生成json的时候没有key,所以与jsonTools不一样 gson.fromJson(jsonString, cls);或者gson.fromJson(jsonString);

使用到了反射的概念,服务器端和客户端解析和逆解析的对象都是同样的对象(在这里是person),使用jsonTools解析对象的时候,需要指明返回的类型,

但是使用gsonTools则采用泛型,使得gsonTools成为一个工具类,即不论服务器端返回何种类型的对象,客户端只要知道返回的类型都能进行解析,不用知道传递什么类型,也不用返回既定的类型

T指的是通用泛型,可以指任意的数据类型

4.mainactivity

 1 package com.android.gson;
 2
 3
 4 import java.util.List;
 5 import java.util.Map;
 6
 7 import com.android.gson.domain.Person;
 8 import com.android.gson.gsonTools.GsonTools;
 9 import com.android.gson.http.HttpUtils;
10 import com.example.android_05json_gson.R;
11
12 import android.app.Activity;
13 import android.os.Bundle;
14 import android.util.Log;
15 import android.view.Menu;
16 import android.view.MenuItem;
17 import android.view.View;
18 import android.view.View.OnClickListener;
19 import android.widget.Button;
20
21 public class MainActivity extends Activity implements OnClickListener{
22     private Button person, persons, liststring, listmap;
23     private static final String TAG = "MainActivity";
24     @Override
25     protected void onCreate(Bundle savedInstanceState) {
26         super.onCreate(savedInstanceState);
27         setContentView(R.layout.activity_main);
28         person = (Button) this.findViewById(R.id.person);
29         persons = (Button) this.findViewById(R.id.persons);
30         liststring = (Button) this.findViewById(R.id.liststring);
31         listmap = (Button) this.findViewById(R.id.listmap);
32         person.setOnClickListener(this);
33         persons.setOnClickListener(this);
34         liststring.setOnClickListener(this);
35         listmap.setOnClickListener(this);
36     }
37
38     @Override
39     public boolean onCreateOptionsMenu(Menu menu) {
40         // Inflate the menu; this adds items to the action bar if it is present.
41         getMenuInflater().inflate(R.menu.main, menu);
42         return true;
43     }
44
45     @Override
46     public boolean onOptionsItemSelected(MenuItem item) {
47         // Handle action bar item clicks here. The action bar will
48         // automatically handle clicks on the Home/Up button, so long
49         // as you specify a parent activity in AndroidManifest.xml.
50         int id = item.getItemId();
51         if (id == R.id.action_settings) {
52             return true;
53         }
54         return super.onOptionsItemSelected(item);
55     }
56
57     @Override
58     public void onClick(View v) {
59         // TODO Auto-generated method stub
60         switch (v.getId()) {
61         case R.id.person:
62             String path = "http://122.206.79.193:8080/gsonProject/servlet/JsonAction?action_flag=person";
63             String jsonString = HttpUtils.getJsonContent(path);
64             Person person=GsonTools.getPerson(jsonString, Person.class);
65             Log.i(TAG, person.toString());
66             break;
67         case R.id.persons:
68             String path2 = "http://122.206.79.193:8080/gsonProject/servlet/JsonAction?action_flag=persons";
69             String jsonString2 = HttpUtils.getJsonContent(path2);
70             List<Person> list=GsonTools.getPersons(jsonString2, Person.class);
71             Log.i(TAG, list.toString());
72             break;
73         case R.id.liststring:
74             String path3 = "http://122.206.79.193:8080/gsonProject/servlet/JsonAction?action_flag=liststring";
75             String jsonString3 = HttpUtils.getJsonContent(path3);
76             List<String> list3=GsonTools.getList(jsonString3);
77             Log.i(TAG, list3.toString());
78             break;
79         case R.id.listmap:
80             String path4 = "http://122.206.79.193:8080/gsonProject/servlet/JsonAction?action_flag=listmap";
81             String jsonString4 = HttpUtils.getJsonContent(path4);
82             List<Map<String,Object>> list4=GsonTools.listKeyMaps(jsonString4);
83             Log.i(TAG, list4.toString());
84             break;
85         }
86     }
87 }

---------------------------------------

阿里巴巴FastJson技术

ØFastJson是一个Json处理工具包,包括“序列化”和“反序列化”两部分,它具备如下特征:速度最快,测试表明,fastjson具有极快的性能,超越任其他的Java Json parser。包括自称最快的JackJson。功能强大,完全支持Java Bean、集合、Map、日期、Enum,支持范型,支持自省。无依赖,能够直接运行在Java SE 5.0以上版本.支持Android。开源 (Apache 2.0)

示例:只需要讲gson客户端稍加修改即可

1.首先卸载gson的包,并引用fastJson的包

2.FastJsonTools最不同,

返回单个对象:JSON.parseObject(jsonString, cls);

返回List<T>JSON.parseArray(jsonString, cls);

返回List<Map<String, Object>>JJSON.parseObject(jsonString,new TypeReference<List<Map<String, Object>>>() {});

 1 package com.android.gson.fastJsonTools;
 2 import java.util.ArrayList;
 3 import java.util.List;
 4 import java.util.Map;
 5
 6 import com.alibaba.fastjson.JSON;
 7 import com.alibaba.fastjson.TypeReference;
 8
 9 ;
10 public class FastJsonTools {
11
12     public FastJsonTools() {
13         // TODO Auto-generated constructor stub
14     }
15
16     /**
17      * @param <T>
18      * @param jsonString
19      * @param cls
20      * @return单条数据单个javabean
21      */
22     public static <T> T getPerson(String jsonString, Class<T> cls) {
23         T t = null;
24         try {
25             t = JSON.parseObject(jsonString, cls);
26         } catch (Exception e) {
27             // TODO: handle exception
28         }
29         return t;
30     }
31
32     /**
33      * 使用Gson进行解析 List<Person>
34      *
35      * @param <T>
36      * @param jsonString
37      * @param cls
38      * @return
39      */
40     public static <T> List<T> getPersons(String jsonString, Class<T> cls) {
41         List<T> list = new ArrayList<T>();
42         try {
43             list = JSON.parseArray(jsonString, cls);
44         } catch (Exception e) {
45         }
46         return list;
47     }
48
49
50
51     public static List<Map<String, Object>> listKeyMaps(String jsonString) {
52         List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
53         try {
54             list = JSON.parseObject(jsonString,
55                     new TypeReference<List<Map<String, Object>>>() {
56             });
57         } catch (Exception e) {
58             // TODO: handle exception
59         }
60         return list;
61     }
62 }

时间: 2024-10-08 10:04:10

Android 之json解析2的相关文章

Android项目--Json解析

在过去的一段时间里,我希望做一个天气的应用,但是由于老版的天气接口已经不能用了.只能更新到2014年3月4日. 不过有些东西,哪来学习一下,也是可以的. 比如:http://m.weather.com.cn/data/101050101.html { "weatherinfo": { "city": "哈尔滨", "city_en": "haerbin", "date_y": "

Android之JSON解析

做个Android网络编程的同学一定对于JSON解析一点都不陌生,因为现在我们通过手机向服务器请求资源,服务器给我们返回的数据资源一般都是以JSON格式返回,当然还有一些通过XML格式返回,相对JSON格式,XML格式的数据在处理时相对比较繁琐,并且Android为我们提供了两个解析JSON对象的类:JSONObject与JSONArray这两个对象可以很好的满足我们的需求,JSONArray对象可以以数组的形式将数据返回到手机,JSONObject对象则可以以对象的形式将数据为我们封装好返回,

浅谈Android项目----JSON解析(4种解析技术详解)

json简介 1.概念:json全称是javaScript object Notation,是一种并轻量级的数据交换格式. 2.特点: 1.本质就是具有特定格式的字符串 2.json完全独立于编程语言 3.json比xml数据传输的有效性要高出很多 Android系统也原生的提供了JSON解析的API,但是它的速度很慢,而且没有提供简介方便的接口来提高开发者的效率和降低出错的可能.因此,通常情况下,我们都会选择其他优秀的JSON解析实现,用以替代系统的API,目前JSON解析的开源实现主要包括一

Android平台json解析(FastJson Gson 大比拼)

前言: 最近为了统一项目中使用的框架,发现项目中用到了两种json解析框架,他们就是当今非常主流的json解析框架:google的Gson 和阿里巴巴的FastJson,为了废除其中一个所以来个性能和使用的大比拼. FastJson 当前使用版本 fastjson-1.2.11.jar 下载地址http://repo1.maven.org/maven2/com/alibaba/fastjson/1.2.11/ 对象转化成json: /** * 对象转化为json fastjson 使用方式 *

android的json解析

转http://blog.csdn.net/qxs965266509/article/details/42774691 Google Gson的使用方法,实现Json结构的相互转换 分类: android Json2015-01-16 12:03 884人阅读 评论(0) 收藏 举报 在Java开发中,有时需要保存一个数据结构成字符串,可能你会考虑用Json,但是当Json字符串转换成Java对象时,转换成的是JsonObject,并不是你想要的Class类型的对象,操作起来就很不是愉悦,下面说

android复杂json解析

JSON建构有两种结构:对象和数组 json简单说就是javascript中的对象和数组,所以这两种结构就是对象和数组2种结构,通过这两种结构可以表示各种复杂的结构. 以下是项目中的一段json格式,也并不算很复杂,贴出解析方式和思路: { "result":true,"msgType":3,"count":16,"batchId":"hb20140711", "companyFullName&q

android通用JSON解析

ackage cn.com.pcgroup.<a href="http://lib.csdn.net/base/15" class="replace_word" title="Android知识库" target="_blank" style="color:#df3434; font-weight:bold;">android</a>.browser.module.onlinepro

Android之JSON格式数据解析

查看原文:http://blog.csdn.net/hantangsongming/article/details/42234293 JSON:JavaScript 对象表示法(JavaScript Object Notation).独立于语言和平台,比 XML 更小.更快,更易解析.如今JSON数据已经成为了互联网中大多数数据的传递方式,所以必须要熟练掌握. Android平台自带了JSON解析的相关API,可以将文件.输入流中的数据转化为JSON对象,然后从对象中获取JSON保存的数据内容.

android json解析及简单例子

JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换.JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为. – Json.org JSON Vs XML 1.JSON和XML的数据可读性基本相同 2.JSON和XML同样拥有丰富的解析手段 3.JSON相对于XML来讲,数据的体积小 4.JSON与JavaScript的交互更加方便