如何用java gson解析动态json对象值

i7uaboj4  于 12个月前  发布在  Java
关注(0)|答案(3)|浏览(119)

我有两个班

class X {
  public String name;
  public int age;
}

个字符
json是这样的

{
  "type": "X",
  "data": {
    "name": "myname",
    "age": 20
  }
}


{
  "type": "Y",
  "data": {
    "score": 10
  }
}


如何使用gson解析json,但如果type字段为X,则数据将为X类示例

jgovgodb

jgovgodb1#

var m = new TreeMap();
m.put("type", X.class.getSimpleName());
m.put("data", new X("myname", 20));

var gson = new Gson();
var json = gson.toJson(m);

字符串
如果不想创建自定义适配器,请尝试使用Map!
这可能是最简单的解决方案之一

epfja78i

epfja78i2#

您希望根据 type 元素的值来对JSON进行格式化。因此,您解析JSON并提取 type 元素的值。然后提取 data 元素并使用Gson将其格式化为Java对象。

import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

public class GsonTest {

    public static void main(String[] args) {
        String json = """
{
  "type": "X",
  "data": {
    "name": "myname",
    "age": 20
  }
}
""";
        JsonElement root = JsonParser.parseString(json);
        JsonObject obj = root.getAsJsonObject();
        JsonElement typeElem = obj.get("type");
        String type = typeElem.getAsString();
        JsonElement dataElem = obj.get("data");
        Gson gson = new Gson();
        Class<?> theClass;
        if ("X".equals(type)) {
            theClass = X.class;
        }
        else if ("Y".equals(type)) {
            theClass = Y.class;
        }
        else {
            theClass = null;
        }
        if (theClass != null) {
            Object result = gson.fromJson(dataElem, theClass);
            System.out.println(result);
        }
    }
}

字符串
上面的代码使用了Java 15中添加的text blocks
我给X类添加了一个toString方法:

public String toString() {
    return String.format("%s:%d", name, age);
}


当我运行上面的代码时,我得到以下结果:

myname:20


请注意,通常会使类X和类YJavaBeans,即您需要添加“getters”和“setters”。
下面是一个完整的代码:

import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

public class GsonTest {

    public static void main(String[] args) {
        String json = """
{
  "type": "Y",
  "data": {
    "score": 10
  }
}
""";
        JsonElement root = JsonParser.parseString(json);
        JsonObject obj = root.getAsJsonObject();
        JsonElement typeElem = obj.get("type");
        String type = typeElem.getAsString();
        JsonElement dataElem = obj.get("data");
        Gson gson = new Gson();
        Class<?> theClass;
        if ("X".equals(type)) {
            theClass = X.class;
        }
        else if ("Y".equals(type)) {
            theClass = Y.class;
        }
        else {
            theClass = null;
        }
        if (theClass != null) {
            Object result = gson.fromJson(dataElem, theClass);
            System.out.println(result);
        }
    }
}

class X {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return String.format("%s:%d", name, age);
    }
}

class Y {
    private float score;

    public float getScore() {
        return score;
    }

    public void setScore(float score) {
        this.score = score;
    }

    public String toString() {
        return Float.toString(score);
    }
}


参考Gson User Guide

zphenhs4

zphenhs43#

我发现如何后,一些问题,以谷歌吟游诗人.

public static class CustomTypeAdapter extends TypeAdapter<Object> {
    @Override
    public void write(JsonWriter out, Object value) {

    }

    @Override
    public Object read(JsonReader reader) {
        JsonObject jsonObject = JsonParser.parseReader(reader).getAsJsonObject();

        String type = jsonObject.get("type").getAsString();

        System.out.println(type);

        return switch (type) {
            case "X" -> new Gson().fromJson(jsonObject.get("data"), X.class);
            case "Y" -> new Gson().fromJson(jsonObject.get("data"), Y.class);
            default -> throw new JsonParseException("Unknown type: " + type);
        };
    }
}

字符串
那我就这样用

JsonReader reader = new Gson().newJsonReader(new StringReader("{\"type\":\"X\",\"data\":{\"name\":\"Name\",\"age\":10}}"));

Object output = new CustomTypeAdapter().read(reader);

System.out.println(((X) output).name);


但是有了这个,我不知道为什么我扩展了TypeAdapter<Object> ..我认为我不需要它。

相关问题