【java学习】Json框架

1,概念

1)JavaBean

JavaBean不是一个编程规则,也不是语法规范,它是一个习惯性的编程规范。在fastJson中,解析用到的实体类必须严格按照JavaBean规范来写。
特点:
①类为public
②有一个无参数的构造方法。
③属性为私有,通过getXxx()和setXxx方法设置属性(方法的第四个字母为大写)。
④必须实现序列号接口。

2)结构

json只支持下面两种结构,只要是不符合上面两种结构的都不被支持,并提示错误。所以json也不能有注释。

①JSONObject(名称/值对的集合:key : value样式)

json对象,是系统有关JSON定义的基本单位,包含一对数值(key/value)。要求不能为null。

②JSONArray(值的有序列表:Array)

代表一组有序数值。
将JSONArray转换为String输出(toString)所表现的形式是用方括号包裹,数值以逗号分割。
例如:[value1,value2,value3]

3)JSONStringer

json文本构建类 ,这个类可以帮助快速和便捷的创建JSON text。
最大的优点是可以减少由于格式的错误导致程序异常,引用这个类可以自动严格按照JSON语法规则创建JSON text.每个JSONStringer实体只能对应对应创建一个JSON text.

4)JSONException

json中用到的异常。

5)json属性

json对象要求属性必须加双引号。

2,Json(JavaScript Object Notation):

1)介绍

一种轻量级的数据交换格式。
JSON数据是一系列键值对的集合。

2)特点

体积小、解码方便、易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。
Android自带的Json类库:效率低,使用繁琐,不支持反射解析,不推荐使用。

3)与xml对比

json相对XML,解析更加方便。
可读性方面:不相上下。扩展性方面:xml扩展性很好,但json都可以做到。json速度快,但是对数据的描述性比xml差。

4)格式

①对象

无序的键值对集合,以“{}”包裹;每个名称后有一个冒号;”名称/值“对之间使用用逗号间隔。

②数组

是值的有序 集合,以“[]”包裹,值之间以逗号分隔。

如下 表示一个数组,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"}]

5)使用

①json字符串转换为json对象

JSONObject jsonObject = JSONObject.fromObject(jsonStr);

②json对象转换为java对象

Person jb = (Person)JSONObject.toBean(obj,Person.class);

③java对象转换为json字符串

JSONObject json = JSONObject.fromObject(obj);//将java对象转换为json对象
String str = json.toString();//将json对象转换为字符串

④json字符串转List

数据格式:[{},{}]

Gson gson = new Gson();
List list = gson.fromJson(jsonStr, new TypeToken>() {}.getType());     

⑤List转json字符串

        Gson gson = new Gson();
        List list = new ArrayList();
        String str = gson.toJson(list);

6)JSON/ JSONP区别

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只有在跨域获取数据才会用到。

3,FastJson框架

1)介绍

FastJson是阿里巴巴开发的Json处理工具包。因为要引用第三方的包,所以使用较少。

2)优缺点

①优点

速度最快,超越任其他的Java Json parser。
功能强大,完全支持Java Bean、集合、Map、日期、Enum,支持范型,支持自省。

②缺点

fastjson严格安卓JavaBean的规范(详情查看1-(2)),实体类有一点不对就无法解析。而Gson就无此要求。

3)使用

Obj的序列号和反序列化

str = JSONObject.toJSONString(obj);//序列化
GPeople gPeople = (GPeople)JSONObject.parseObject(str, GPeople.class); //反序列化

List序列化和反序列化

JSONArray.toJSONString(list); //序列化
list = JSONArray.parseArray(str, PortalVo.class)

另一种方法:

str = JSON.toJSONString(students);
list = JSON.parseObject(json,new TypeReference>(){}); //Student 对象要实现Serializable接口

4,Gson

1)介绍:

Gson是Google开发的Java API,用于转换Java对象和Json对象。是目前使用最多的Json框架。使用方便,资料比较多,效率对于小量的数据解析来说没有问题。

maven地址:
implementation ‘com.google.code.gson:gson:2.8.5’

2)使用:

实现反序列化:fromJson. 实现序列化:toJson.

①基本数据类型的解析:

Gson gson = new Gson();
int i = gson.fromJson("100", int.class);              //100

②基本数据类型的生成:

Gson gson = new Gson();
String jsonNumber = gson.toJson(100);      // 100

3)封装通用类

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();
    }
}

5,Jackson框架

1)介绍

Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象。比较老,比较大,效率较低。相比前两个框架基本不怎么用了。
是三种Json框架(包括Gson,Jackson)中最快、包最小、解码最方便的。

Gson gson = new Gson();
int i = gson.fromJson("100", int.class);              //100

5,可以替换json的其他

1)FlatBuffer

是google的一个跨平台串行化库,开发这个最初是用在游戏项目中,是二进制存储和二进制读取,不需要解析,通过fb的二进制文件生成对象的时间可以忽略。需要通过工具把普通model文件生成flatBuffer格式的model文件。flatBuffer解析library就四个文件,代码很少。本地cache比较大的可以考虑通过这种方式存储和读取。
Json是当今全服务平台的轻量级数据传输格式,Json量级轻,并且可读性强,使用友好却不过时,Json是语言独立的数据格式,但Json转换的时候却耗费较多的时间和内存,Facebook尝试过将所有的App中Json传输都换成使用Flatbuffers,而最终的效果遵循Android快速响应界面的16ms原则。

2)ProtocolBuffer

google出品。适用于网络API,传输数据会有压缩,接收方有解析时间,同样要生成特定的PB model文件,一般用于传输数据比较大的API。
强大,灵活,但是对内存的消耗会比较大,并不是移动终端上的最佳选择。

3)Nano-Proto-Buffers

基于Protocal,为移动终端做了特殊的优化,代码执行效率更高,内存使用效率更佳。

你可能感兴趣的:(java学习)