我有两个班
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类示例
X
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!这可能是最简单的解决方案之一
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”。下面是一个完整的代码:
Y
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
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> ..我认为我不需要它。
TypeAdapter<Object>
3条答案
按热度按时间jgovgodb1#
字符串
如果不想创建自定义适配器,请尝试使用Map!
这可能是最简单的解决方案之一
epfja78i2#
您希望根据 type 元素的值来对JSON进行格式化。因此,您解析JSON并提取 type 元素的值。然后提取 data 元素并使用Gson将其格式化为Java对象。
字符串
上面的代码使用了Java 15中添加的text blocks。
我给
X
类添加了一个toString方法:型
当我运行上面的代码时,我得到以下结果:
型
请注意,通常会使类
X
和类Y
JavaBeans,即您需要添加“getters”和“setters”。下面是一个完整的代码:
型
参考Gson User Guide
zphenhs43#
我发现如何后,一些问题,以谷歌吟游诗人.
字符串
那我就这样用
型
但是有了这个,我不知道为什么我扩展了
TypeAdapter<Object>
..我认为我不需要它。