JavaBean不是一个编程规则,也不是语法规范,它是一个习惯性的编程规范。在fastJson中,解析用到的实体类必须严格按照JavaBean规范来写。
特点:
①类为public
②有一个无参数的构造方法。
③属性为私有,通过getXxx()和setXxx方法设置属性(方法的第四个字母为大写)。
④必须实现序列号接口。
json只支持下面两种结构,只要是不符合上面两种结构的都不被支持,并提示错误。所以json也不能有注释。
json对象,是系统有关JSON定义的基本单位,包含一对数值(key/value)。要求不能为null。
代表一组有序数值。
将JSONArray转换为String输出(toString)所表现的形式是用方括号包裹,数值以逗号分割。
例如:[value1,value2,value3]
json文本构建类 ,这个类可以帮助快速和便捷的创建JSON text。
最大的优点是可以减少由于格式的错误导致程序异常,引用这个类可以自动严格按照JSON语法规则创建JSON text.每个JSONStringer实体只能对应对应创建一个JSON text.
json中用到的异常。
json对象要求属性必须加双引号。
一种轻量级的数据交换格式。
JSON数据是一系列键值对的集合。
体积小、解码方便、易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。
Android自带的Json类库:效率低,使用繁琐,不支持反射解析,不推荐使用。
json相对XML,解析更加方便。
可读性方面:不相上下。扩展性方面:xml扩展性很好,但json都可以做到。json速度快,但是对数据的描述性比xml差。
无序的键值对集合,以“{}”包裹;每个名称后有一个冒号;”名称/值“对之间使用用逗号间隔。
是值的有序 集合,以“[]”包裹,值之间以逗号分隔。
如下 表示一个数组,3个对象。
[{"StuNum":"1001","StuName":"1","Sex":"1","StuTel":"1","Sclass":"1","Academic":"1"}, {"StuNum":"1002","StuName":"2","Sex":"2","StuTel":"2","Sclass":"2","Academic":"2"}, {"StuNum":"1003","StuName":"3","Sex":"3","StuTel":"3","Sclass":"3","Academic":"3"}]
JSONObject jsonObject = JSONObject.fromObject(jsonStr);
Person jb = (Person)JSONObject.toBean(obj,Person.class);
JSONObject json = JSONObject.fromObject(obj);//将java对象转换为json对象
String str = json.toString();//将json对象转换为字符串
数据格式:[{},{}]
Gson gson = new Gson();
List list = gson.fromJson(jsonStr, new TypeToken>() {}.getType());
Gson gson = new Gson();
List list = new ArrayList();
String str = gson.toJson(list);
JSONP(JSON with Padding).
json返回的是一串数据;而jsonp返回的是脚本代码(包含一个函数调用);
JSON其实就是JavaScript中的一个对象,跟var obj={}在质上完全一样,只是在量上可以无限扩展。简单地讲,json其实就是JavaScript中的对象(Object)和数组(Array,其实也是对象)这倆好基友在那儿你嵌我我嵌你地套上n多层,以此模拟出许多复杂的数据结构。
json是理想的数据交换格式,但没办法跨域直接获取,于是就将json包裹(padding)在一个合法的js语句中作为js文件传过去。这就是json和jsonp的区别,json是想要的东西,jsonp是达到这个目的而普遍采用的一种方法,当然最终获得和处理的还是json。所以说json是目的,jsonp只是手段。json总会用到,而jsonp只有在跨域获取数据才会用到。
FastJson是阿里巴巴开发的Json处理工具包。因为要引用第三方的包,所以使用较少。
速度最快,超越任其他的Java Json parser。
功能强大,完全支持Java Bean、集合、Map、日期、Enum,支持范型,支持自省。
fastjson严格安卓JavaBean的规范(详情查看1-(2)),实体类有一点不对就无法解析。而Gson就无此要求。
str = JSONObject.toJSONString(obj);//序列化
GPeople gPeople = (GPeople)JSONObject.parseObject(str, GPeople.class); //反序列化
JSONArray.toJSONString(list); //序列化
list = JSONArray.parseArray(str, PortalVo.class)
另一种方法:
str = JSON.toJSONString(students);
list = JSON.parseObject(json,new TypeReference>(){}); //Student 对象要实现Serializable接口
Gson是Google开发的Java API,用于转换Java对象和Json对象。是目前使用最多的Json框架。使用方便,资料比较多,效率对于小量的数据解析来说没有问题。
maven地址:
implementation ‘com.google.code.gson:gson:2.8.5’
实现反序列化:fromJson. 实现序列化:toJson.
Gson gson = new Gson();
int i = gson.fromJson("100", int.class); //100
Gson gson = new Gson();
String jsonNumber = gson.toJson(100); // 100
package util;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;
import entity.DraftStorgeProblemEntity;
import entity.UploadEntity;
import java.lang.reflect.Type;
import java.util.List;
/**
* Java对象和JSON字符串相互转化工具类
* @author luo
* @date 2018-06-21
*/
public final class JsonUtil {
private JsonUtil(){}
/**
* 对象转换成json字符串
* @param obj
* @return
*/
public static String toJson(Object obj) {
Gson gson = new Gson();
return gson.toJson(obj);
}
/**
* json字符串转成对象
* @param str
* @param type
* @return
*
* 调用方法:
UploadEntity uploadEntity1 = JsonUtil.fromJson(jsonStr, new TypeToken>() {
}.getType());
*/
public static T fromJson(String str, Type type) {
Gson gson = new Gson();
return gson.fromJson(str, type);
}
/**
* json字符串转成对象
* @param str
* @param type
* @return
*
* 调用方法:
UploadEntity uploadEntity1 = JsonUtil.fromJson(jsonStr, UploadEntity.class);
但这样无法解析内层的ProblemEntity。建议采用TypeToken来调用
*/
public static T fromJson(String str, Class type) {
Gson gson = new Gson();
return gson.fromJson(str, type);
}
/**
* 列表转换为JsonArray
* @param list
* @param
* @return
*/
public static JsonArray list2JsonArray(List list){
return new Gson().toJsonTree(list, new TypeToken>() {
}.getType()).getAsJsonArray();
}
/**
* jsonArray转List
* @param jsonArray
* @param clazz
* @param
* @return
*
* 使用:List list1 = (List) JsonUtil.jsonArray2List(jsonArray, UploadEntity.class);
*/
public static List jsonArray2List(JsonArray jsonArray, Class clazz) {
return new Gson().fromJson(jsonArray,new TypeToken>() {
}.getType());
}
/**
* Object转JsonObject
* @param obj
* @return
*/
public static JsonObject object2JsonObject(Object obj){
return new Gson().toJsonTree(obj).getAsJsonObject();
}
/**
* JsonString转JsonObject
* @param str
* @return
*/
public static JsonObject jsonString2JsonObject(String str){
return new JsonParser().parse(str).getAsJsonObject();
}
}
Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象。比较老,比较大,效率较低。相比前两个框架基本不怎么用了。
是三种Json框架(包括Gson,Jackson)中最快、包最小、解码最方便的。
Gson gson = new Gson();
int i = gson.fromJson("100", int.class); //100
是google的一个跨平台串行化库,开发这个最初是用在游戏项目中,是二进制存储和二进制读取,不需要解析,通过fb的二进制文件生成对象的时间可以忽略。需要通过工具把普通model文件生成flatBuffer格式的model文件。flatBuffer解析library就四个文件,代码很少。本地cache比较大的可以考虑通过这种方式存储和读取。
Json是当今全服务平台的轻量级数据传输格式,Json量级轻,并且可读性强,使用友好却不过时,Json是语言独立的数据格式,但Json转换的时候却耗费较多的时间和内存,Facebook尝试过将所有的App中Json传输都换成使用Flatbuffers,而最终的效果遵循Android快速响应界面的16ms原则。
google出品。适用于网络API,传输数据会有压缩,接收方有解析时间,同样要生成特定的PB model文件,一般用于传输数据比较大的API。
强大,灵活,但是对内存的消耗会比较大,并不是移动终端上的最佳选择。
基于Protocal,为移动终端做了特殊的优化,代码执行效率更高,内存使用效率更佳。