com.google.gson.JsonArray JsonObject JsonParser

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方式,其为更底层实现。速度更快、当需要更多代码进行判断标记类型进行解析。
 

包含以下java源文件: com.google.gson.DefaultDateTypeAdapter.class com.google.gson.ExclusionStrategy.class com.google.gson.FieldAttributes.class com.google.gson.FieldNamingPolicy.class com.google.gson.FieldNamingStrategy.class com.google.gson.Gson.class com.google.gson.GsonBuilder.class com.google.gson.InstanceCreator.class com.google.gson.JsonArray.class com.google.gson.JsonDeserializationContext.class com.google.gson.JsonDeserializer.class com.google.gson.JsonElement.class com.google.gson.JsonIOException.class com.google.gson.JsonNull.class com.google.gson.JsonObject.class com.google.gson.JsonParseException.class com.google.gson.JsonParser.class com.google.gson.JsonPrimitive.class com.google.gson.JsonSerializationContext.class com.google.gson.JsonSerializer.class com.google.gson.JsonStreamParser.class com.google.gson.JsonSyntaxException.class com.google.gson.LongSerializationPolicy.class com.google.gson.TreeTypeAdapter.class com.google.gson.TypeAdapter.class com.google.gson.TypeAdapterFactory.class com.google.gson.annotations.Expose.class com.google.gson.annotations.SerializedName.class com.google.gson.annotations.Since.class com.google.gson.annotations.Until.class com.google.gson.internal.ConstructorConstructor.class com.google.gson.internal.Excluder.class com.google.gson.internal.JsonReaderInternalAccess.class com.google.gson.internal.LazilyParsedNumber.class com.google.gson.internal.LinkedTreeMap.class com.google.gson.internal.ObjectConstructor.class com.google.gson.internal.Primitives.class com.google.gson.internal.Streams.class com.google.gson.internal.UnsafeAllocator.class com.google.gson.internal.bind.ArrayTypeAdapter.class com.google.gson.internal.bind.CollectionTypeAdapterFactory.class com.google.gson.internal.bind.DateTypeAdapter.class com.google.gson.internal.bind.JsonTreeReader.class com.google.gson.internal.bind.JsonTreeWriter.class com.google.gson.internal.bind.MapTypeAdapterFactory.class com.google.gson.internal.bind.ObjectTypeAdapter.class com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.class com.google.gson.internal.bind.SqlDateTypeAdapter.class com.google.gson.internal.bind.TimeTypeAdapter.class com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.class com.google.gson.internal.bind.TypeAdapters.class com.google.gson.reflect.TypeToken.class com.google.gson.stream.JsonReader.class com.google.gson.stream.JsonScope.class com.google.gson.stream.JsonToken.class com.google.gson.stream.JsonWriter.class com.google.gson.stream.MalformedJsonException.class
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值