JSONArray是一个有序的值序列,它的外部文本形式是一个用方括号括起来的字符串,用逗号分隔值,内部表单是具有索引的对象“get”和“opt”用于通过索引访问值的“element”方法,以及用于添加或替换值的方法。[{"name":"tom"},{"name":"kate"}]
JsonArray array = new JsonArray();
array.add((JsonObject) obj.get("data").getAsJsonArray().get(0));
JSONObject只是一种数据结构,可以理解为JSON格式的数据结构(key-value 结构),可以使用put方法给json对象添加元素。JSONObject可以很方便的转换成字符串,也可以很方便的把其他对象转换成JSONObject对象。
//JSON字符串转换成JSON对象
JSONObject jsonObject1 = JSONObject.parseObject(stuString);
//list转json字符串
String string = JSON.toJSON(studentLsit).toString();
//json字符串转listJson格式
JSONArray jsonArray = JSONObject.parseArray(string);
//对象转成string
String stuString = JSONObject.toJSONString(student);
//原生生成json数据格式
JSONObject zhangsan = new JSONObject();
zhangsan.put("name", "张三");
zhangsan.put("age", 18.4);
zhangsan.toString()
实际应用中经常需要解析json数据,如查询NoSql数据库时响应数据格式通常为Json格式。JsonNode可以非常方便地实现,JsonParser类是底层JSon解析器,类似于Java使用stAx解析xml;但JsonParser仅仅解析Json。JsonParser实现相较于ObjectMapper更底层,因此解析速度更快,但相对复杂。
①创建JsonParser
要创建JsonParser需先创建JsonFactory。JsonFactory用于创建JsonParser实例,其有几个createParser方法,实现对不同json来源。下面示例创建JsonParser解析Json字符串:
String carJson = "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";
JsonFactory factory = new JsonFactory();
JsonParser parser = factory.createParser(carJson);
②JsonParser解析json
创建完JsonParser实例后,可以用其解析json数据。JsonParser工作方式是将JSON分解成一系列标记(token),逐个迭代这些标记进行解析。
下面JsonParser示例通过简单循环所有标记并打印至控制台。这个示例没有实际价值,但展示了如何分解json为标记的过程,同时展示遍历标记的基本知识:
String carJson ="{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";
JsonFactory factory = new JsonFactory();
JsonParser parser = factory.createParser(carJson);
while(!parser.isClosed()){
JsonToken jsonToken = parser.nextToken();
System.out.println("jsonToken = " + jsonToken);
}
只要JsonParser的isClosed()方法返回false,则说明源json仍有标记没有被解析。
通过JsonParser的nextToken()方法获得JsonToken,我们可以检查JsonToken实例的类型,JsonToken 类提供了一组常量表示标记类型:
START_OBJECT
END_OBJECT
START_ARRAY
END_ARRAY
FIELD_NAME
VALUE_EMBEDDED_OBJECT
VALUE_FALSE
VALUE_TRUE
VALUE_NULL
VALUE_STRING
VALUE_NUMBER_INT
VALUE_NUMBER_FLOAT
我们可以使用这些常量检查当前JsonToken 是什么类型,具体实例:
String carJson ="{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";
JsonFactory factory = new JsonFactory();
JsonParser parser = factory.createParser(carJson);
Car car = new Car();
while(!parser.isClosed()){
JsonToken jsonToken = parser.nextToken();
if(JsonToken.FIELD_NAME.equals(jsonToken)){
String fieldName = parser.getCurrentName();
System.out.println(fieldName);
jsonToken = parser.nextToken();
if("brand".equals(fieldName)){
car.brand = parser.getValueAsString();
} else if ("doors".equals(fieldName)){
car.doors = parser.getValueAsInt();
}
}
}
System.out.println("car.brand = " + car.brand);
System.out.println("car.doors = " + car.doors);
如果标记指针指向的是字段,JsonParser的getCurrentName()方法返回当前字段名称。getValueAsString() 返回当前标记值的字符串类型,同理 getValueAsInt()返回整型值,其他方法还有返回boolean, short, long, float, double 等类型。
③总结
本文介绍了Jackson JsonParser解析json,不同于JsonNode方式,其为更底层实现。速度更快、当需要更多代码进行判断标记类型进行解析。