Android 之json解析
来源:互联网 发布:后期制作需要什么软件 编辑:程序博客网 时间:2024/04/29 23:14
JSON(JavaScript Object Notation) 定义:字符串 键值对 解析方法有JSON,谷歌GSON,阿里巴巴FastJSON(推荐)
一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。
业内主流技术为其提供了完整的解决方案(有点类似于正则表达式,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换。
JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。
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。
(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()。
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技术
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
---------------------------------------
阿里巴巴FastJson技术
ØFastJson是一个Json处理工具包,包括“序列化”和“反序列化”两部分,它具备如下特征:速度最快,测试表明,fastjson具有极快的性能,超越任其他的Java Json parser。包括自称最快的JackJson。功能强大,完全支持Java Bean、集合、Map、日期、Enum,支持范型,支持自省。无依赖,能够直接运行在Java SE 5.0以上版本.支持Android。开源 (Apache 2.0)
返回List<Map<String, Object>>JJSON.parseObject(jsonString,new TypeReference<List<Map<String, Object>>>() {});
三种方式的对比:
方式是否提供服务器端jsonString的生成方法客户端JsonTools中的方法JSON是:JSONObject jsonObject = new JSONObject();
jsonObject.put(key, value);
解析成单个对象:方法参数为key和jsonStringJSONObject jsonObject = new JSONObject(jsonString);
JSONObject personObject = jsonObject.getJSONObject("person");
赋值之后 return对象;
解析成List<对象>:方法参数为key和jsonStringJSONObject jsonObject = new JSONObject(jsonString);
// 返回json的数组
JSONArray jsonArray = jsonObject.getJSONArray(key);
遍历并 list.add(对象)之后,返回list
解析成List<String>:方法参数为key和jsonStringJSONObject jsonObject = new JSONObject(jsonString);
JSONArray jsonArray = jsonObject.getJSONArray(key);
遍历并 list.add(对象)之后,返回list
解析成List<String>
List<Map<String, Object>> :方法参数为key和jsonString
JSONObject jsonObject = new JSONObject(jsonString);
JSONArray jsonArray = jsonObject.getJSONArray(key);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject2 = jsonArray.getJSONObject(i);
遍历jsonObject2 并 list.add(map)之后,返回list
谷歌GSON是:Gson gson = new Gson();
String gstr = gson.toJson(value);
Gson gson = new Gson();
t = gson.fromJson(jsonString, cls);
return t即可
解析成List<对象>:方法参数为key和jsonString方法参数为String jsonString, Class<T> clsGson gson = new Gson();
list = gson.fromJson(jsonString, new TypeToken<List<T>>() {
}.getType());
return list;
解析成List<String>:方法参数为jsonStringGson gson = new Gson();
list = gson.fromJson(jsonString, new TypeToken<List<String>>() {
}.getType());
return list;
解析成List<Map<String, Object>>Gson gson = new Gson();
list = gson.fromJson(jsonString,
new TypeToken<List<Map<String, Object>>>() {
}.getType());
return list;
阿里巴巴FastJSON否解析成单个对象:方法参数为String jsonString和 Class<T> cls
t = JSON.parseObject(jsonString, cls);
return t即可
解析成List<T> list = JSON.parseArray(jsonString, cls);
return list;
- android之Json解析
- Android之JSON解析
- Android之Json解析
- android之json解析
- Android之json解析
- Android 之json解析
- Android之JSON解析
- Android之Json解析
- Android之JSON解析
- android之JSON解析
- Android之解析Json
- Android 之json解析
- android之解析json
- Android之解析Json数据
- Android之json数据解析
- Android之json数据解析
- Android学习之解析JSON
- Android之解析Json数据 .
- initializeScrollbars() 方法不存在
- CUDA学习小记
- 记录Bug,引出问题《二》
- Linux bit 操作
- 我们该如何有效的与PD沟通呢?
- Android 之json解析
- C#之数组(排序)
- Android Studio——Android中对MIME类型的理解
- 初识RMAN5:清除RMAN所有配置
- RESTful
- UIView在设置superview frame的时候会改变大小
- GPS卫星信号(二):导航电文
- CodeForces 392C (斐波那契和矩阵的联系)
- Myeclipse快捷键大全