目录
Gson是Google发布的一个处理json的java库。通过使用Gson可以将java对象序列化为json字符串,或是将json字符串反序列化为java对象。
在Gson中,JsonElement是抽象类,由JsonObject、JsonArray、JsonPrimitive和JsonNull四个类继承。其中JsonObject类代表在json中的一个object类型,这个类最常用,可以添加键值对成员,可以通过利用entrySet对JsonObject的对象进行遍历、取键和取值等操作。JsonArray类代表在json中的一个数组类型,可以通过迭代器遍历JsonArray对象。JsonPrimitive类代表在json中的一个原始值,该原始值可以是String类型,java primitive或是java的原始包装类型。JsonNull代表在json中的一个null值。
另外如果使用Maven管理Gson,需要在pom.xml中导入gson的依赖包,如下:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
通过构建json树,可以在遍历过程中,不必指定json键值对的键,这样的解析代码可以处理各种格式的json文件。
import com.google.gson.*;
import org.apache.commons.collections.iterators.EntrySetMapIterator;
import java.util.Map;
public class Main {
public static void main(String[] args) throws Exception {
String str = "{\"valueName1\":{\"firstname\":\"timi\",\"lastname\":\"James\"},\"age\":\"6\",\"edu\":\"SDU\"}";
JsonParser parser = new JsonParser();
JsonElement tree = parser.parse(str);//构建json树
//System.out.println(tree.isJsonObject());//true
JsonObject jo = (JsonObject)tree;//强制转换的目的是之后可以使用entrySet
//System.out.println(jo.keySet());
//System.out.println(jo.entrySet());
for(Map.Entry entry : jo.entrySet()){//遍历构建的json树
JsonElement tmpValue = (JsonElement) entry.getValue();
if(tmpValue.isJsonObject()){
//将取出的键值对的值进行判定,如果值是JsonObject类型,说明内部嵌套了键值对,所以需要进一步处理
JsonObject jo1 = (JsonObject)tmpValue;
for(Map.Entry entry1 : jo1.entrySet()){
//遍历第二层的json键值对
System.out.println(entry1.getKey());
System.out.println(entry1.getValue().toString());
System.out.println("---------------");
}
}else {
//处理没有嵌套的json键值对
System.out.println(entry.getKey());
System.out.println(entry.getValue());
System.out.println("---------------");
}
}
System.out.println("++++--------------------++++++++");
}
}
通过递归,将json进行了扁平化处理,可以应对嵌套多层的json数据。
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.JsonIOException;
import java.util.Map;
public class FlattenJson {
public static void main(String[] args) {
String str = "{\"valueName1\":{\"firstname\":{\"oldname\":\"timi\",\"newname\":\"tim\"},\"lastname\":\"James\"},\"age\":\"33\",\"edu\":\"tim\"}";
JsonParser parser = new JsonParser();
JsonElement tree = parser.parse(str);
//System.out.println(tree.isJsonObject());//true
JsonObject jo = (JsonObject)tree;
JsonObject fa = new JsonObject();
String father = "";
//System.out.println(flatten(jo,fa,father));
JsonObject resultJo = flatten(jo,fa,father);
for(Map.Entry entry : resultJo.entrySet()){
System.out.println(entry.getKey().toString());
System.out.println(entry.getValue().toString());
}
}
private static JsonObject flatten(JsonObject object, JsonObject flattened, String father){
//flatten递归函数实现对多层json的扁平化处理解析,第三个形参仅仅用来保留外层的键并在之后进行拼接
if(flattened == null){
flattened = new JsonObject();
}
// Iterator<String> keys =(Iterator<String>) object.keySet();
for(Map.Entry entry : object.entrySet()){
String midFather = entry.getKey().toString();
String tmp = father;
JsonElement tmpVa = (JsonElement) entry.getValue();
try{
if(tmpVa.isJsonObject()){
//检测到多层json的时候进行递归处理
tmp = tmp +"." + midFather;//当前层键与之前外层键进行拼接
//System.out.println("aaa"+entry.getKey().toString()+"--------"+tmp);
flatten(object.getAsJsonObject(entry.getKey().toString()),flattened,tmp);
} else {
//当前层的值没有嵌套json键值对,直接将键值对添加到flattened中
String nowKeyTmp = father + "." + entry.getKey().toString();
String nowKey = nowKeyTmp.substring(1,nowKeyTmp.length());
flattened.add(nowKey,((JsonElement) entry.getValue()));
}
} catch (JsonIOException e) {
System.out.println(e);
}
}
return flattened;
}
}
本文介绍了Gson库在处理json时的基本用法,包括JsonElement类结构,以及如何通过构建json树解析两层json。进一步探讨了如何通过递归方法将多层嵌套的json数据进行扁平化处理,以适应不同层次的json文件解析需求。
1423

被折叠的 条评论
为什么被折叠?



