Java学习4-9_Json学习

JSON

JavaScript Object Notation,JS对象简谱,是一种轻量级的数据交换格式

一、如何表示一本书

一本书:
	书名
	简介
	
java:
class Book{
	private String name;
	private String info;

	get/set...
}
Book b = new Book();
b.setName(“金苹果”);
b.setInfo(“种苹果”);
...

js:
var b = new Object();
b.name = "金苹果";
b.info = "种苹果";

XML:
<book>
    <name>金苹果</name>
    <info>种苹果</info>
</book>

JSON:
{
    "name":"金苹果",
    "info":"种苹果"
}

json比xml 更小、更快,更易解析

二、对象格式与数组格式

2.1对象格式

{ 
    "name":"金苹果", 
    "info":"种苹果"
}

2.2 数组格式

{
    "name":"伟杰老师",
    "age":18,
    "pengyou":["张三","李四","王二","麻子",{
        "name":"野马老师",
        "info":"像匹野马一样狂奔在技术钻研的道路上"
	}],
    "heihei":{
        "name":"大长刀",
        "length":"40m"
	}
}

三、JSON特点

3.1 特征

  1. JSON 是纯文本
  2. JSON 具有"自我描述性"(人类可读)
  3. JSON 具有层级结构(值中存在值)
  4. JSON 可通过 JavaScript 进行解析
  5. JSON 数据可使用 AJAX 进行传输

3.2 与XML不同点

  1. 没有结束标签
  2. 更短
  3. 读写的速度更快
  4. 能够使用内建的 JavaScript eval() 方法进行解析
  5. 使用数组
  6. 不使用保留字

四、JSON语法

  1. 语法规则,JSON 语法是 JavaScript 对象表示语法的子集。

    • 数据在名称/值对中
    • 数据由逗号分隔
    • 大括号 {} 保存对象
    • 中括号 [] 保存数组,数组可以包含多个对象
  2. JSON 名称/值对

    key : value

  3. JSON 值

    1. 数字(整数或浮点数){ "age":30 }

    2. 字符串(在双引号中)

    3. 逻辑值(true 或 false){ "flag":true }

    4. 数组(在中括号中)

      [{ key1 : value1-1 , key2:value1-2 }, { key1 : value2-1 , key2:value2-2 }]
      
    5. 对象(在大括号中){key1 : value1, key2 : value2, ... keyN : valueN }

    6. null { "runoob":null }

五、JSON使用

5.1 Gson

Gson因应Google公司研发。主要有toJson与fromJson两个转换函数。Gson完全可以将复杂类型的json到bean或bean到json的转换。

使用:

  1. 序列化 / 反序列化

    Gson gson = new Gson();
    //序列化
    String json = gson.toJson(object);
    //反序列化
    Object object = gson.fromJson(json, Object.class);
    
  2. 嵌套对象序列化 / 反序列化

    //对象也为嵌套关系可以直接进行
    
  3. Array

    String myJson = "['ASD131','DFS131','TER131']";
    
    Gson gson = new Gson();
    
    //序列化
    String myJson = gson.toJson(myJson);
    
    //反序列化
    String[] myArray = gson.fromJson(myJson, String[].class);
    
  4. List,List反序列化时必须提供Type

    String myJson = "";
    
    Gson gson = new Gson();
    //序列化
    Type objectListType = new TypeToken<ArrayList<Object>>(){}.getType();
    //反序列化
    List<Object> myList = gson.fromJson(myJson, objectListType); 
    
  5. Map和Set同理

  6. 序列化和反序列化的时候忽略某些变量使用 @Expose 注解标志类中的属性

    GsonBuilder gsonBuilder = new GsonBuilder();  
    gsonBuilder.excludeFieldsWithoutExposeAnnotation();  
    Gson gson = builder.create();
    

5.2 FastJson

Fastjson是一个Java语言编写的高性能的JSON处理器,由阿里巴巴公司开发。FastJson在复杂类型的转换上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。FastJson采用的算法,使得parse解析的速度更快。

  • JSONArray : 相当于List
  • JSONObject: 相当于Map<String,Object>

使用:

  1. 序列化 / 反序列化

    //序列化
    String objJson = JSON.toJSONString(Object object);
    //反序列化
    Object object = JSON.parseObject(objJson, Object.class);
    
  2. Map转JSON

    Map<String, Object> map = new HashMap<String, Object>();
    map.put("key1", "One");
    map.put("key2", "Two");
    
    //序列化
    String mapJson = JSON.toJSONString(map);
    //反序列化
    Map<String, Object> map1 = JSON.parseObject(mapJson, new TypeReference<Map<String, Object>>(){});
    
  3. List转JSON

    List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
    Map<String, Object> map1 = new HashMap<String, Object>();
    map1.put("key1", "One");
    map1.put("key2", "Two");     
    Map<String, Object> map2 = new HashMap<String, Object>();
    map2.put("key1", "Three");
    map2.put("key2", "Four");
    
    list.add(map1);
    list.add(map2);
    //序列化
    String listJson = JSON.toJSONString(list);
    //反序列化
    List<Map> list1 = JSON.parseArray(listJson, Map.class);
    

5.3 Jackson

相比json-lib框架,Jackson所依赖的jar包较少,简单易用并且性能也要相对高些。而且Jackson社区相对比较活跃,更新速度也比较快。Jackson对于复杂类型的json转换bean会出现问题,一些集合Map,List的转换出现问题。Jackson对于复杂类型的bean转换Json,转换的json格式不是标准的Json格式。

用法:

  1. 系列化和反序列化

    ObjectMapper MAPPER = new ObjectMapper();
    
    //反序列化
    //T类型对象,beanType: Class<T>
    T t = MAPPER.readValue(jsonData, beanType);
    
    //序列化
    String jsonString = MAPPER.writeValueAsString(object);
    
  2. List 转化

    //序列化
    String jsonData = MAPPER.writeValueAsString(object);
    
    //反序列化
    Class<T> beanType;
    JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType);
    List<T> list= MAPPER.readValue(jsonData, javaType);
    
  3. Map序列化 / 反序列化

    //序列化
    String jsonString = MAPPER.writeValueAsString(map);
    
    //反序列化
    LinkedHashMap<?, ?> map= new LinkedHashMap<>();
    map = MAPPER.readValue(jsonData,LinkedHashMap.class);
    
  4. 常用注解

    • @JsonIgnoreProperties:此注解是类注解,作用是json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响。
    • @JsonIgnore:此注解用于属性或者方法上(最好是属性上),作用和上面的@JsonIgnoreProperties一样。
    • @JsonFormat:此注解用于属性或者方法上(最好是属性上),可以方便的把Date类型直接转化为我们想要的模式,比如@JsonFormat(pattern = “yyyy-MM-dd HH-mm-ss”)
    • @JsonSerialize:此注解用于属性或者getter方法上或者类上,用于在序列化时嵌入我们自定义的代码,比如序列化一个double时在其后面限制两位小数点。
    • @JsonDeserialize:此注解用于属性或者setter方法上或者类上,用于在反序列化时可以嵌入我们自定义的代码,类似于上面的@JsonSerialize。

5.4 Json-lib

json-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包,包括commons-beanutils.jar,commons-collections-3.2.jar,commons-lang-2.6.jar,commons-logging-1.1.1.jar,ezmorph-1.0.6.jar,对于复杂类型的转换,json-lib对于json转换成bean还有缺陷。

但是JDK8以后,json-lib已经很少被选择使用,性能也不高,了解即可

方法:

  1. JSONSerializer可以任何java对象转换为JSON, 这样就能够方法JSONObject和JSONArray使用了

    //序列化
    JSON json = JSONSerializer.toJSON(book);
    
    //反序列化
    Object tempObj =  JSONSerializer.toJava(json);
    
  2. JSON对象

    //序列化
    JSONObject jsonObject = JSONObject.fromObject(object);
    
    //反序列化
    Object object = (Object)JSONObject.toBean(jsonObject,Object.class);
    
  3. JSONArray数组

    //将一个List对象转化为JSONArray
    JSONArray jsonList = JSONArray.fromObject(list);
    
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值