我之前的问题并没有真正得到任何结果,也许我没有问正确的问题或者它太详细了。
现在我的基本问题是,如何将具有一个类名的 JSON 对象反序列化为具有不同类名的 Java 对象?
例如,服务器发送/期望的 JSON 类是“18”(我对此的控制权为零)。我的 Java 类不能是“18”,所以是“_18”。
即使使用不同的命名策略,简单地执行 new Gson().fromJson() 也没有帮助; _18 对象始终为 null。我已经阅读了有关类型适配器和不同注释的内容,但仍不清楚如何解决这个问题。看起来最明智的方法 @SerializedName 显然不能用于类本身,只能用于字段成员。
如何将具有名为 18 的类的 JSON 对象反序列化为名为 _18 的 Java 类(或者更好的是,如果可能的话,我可以为该类提供真实名称)?
示例 JSON,根据请求:
"18": {
"field1": "value1",
"field2": "value2",
"field3": "value3"
}
最佳答案
首先 - JSON 没有类的概念 - 它是对象的字符串表示形式。 所以,你的例子只是一个格式错误的 JSON。它一定是这样的:
{"18":
{
"field1": "value1",
"field2": "value2",
"field3": "value3"
}
}
这是具有字段“18”的有效 JSON 对象,属于另一个具有 field1
、field2
和 field3
属性的类。
所以,如果服务器返回像您的节目一样的 JSON 字符串 - 要解析它,您必须用 {} 包围它,然后您的 Java 类将具有“18”属性,因为您想通过 @ 将其命名为 Java SerializedName
注释。
请参阅下面的示例测试用例:
public static void main(String... args) throws Exception {
String testJson = "{\"18\":{\"name\":\"poomba\",\"value\":\"topchoomba\"}}";
Gson gson = new GsonBuilder().create();
MyClassFor18 test18 = gson.fromJson(testJson, MyClassFor18.class);
System.out.println(test18);
}
private static class MyClassFor18 {
@SerializedName ("18")
private TestPojo valueObject;
public TestPojo getValueObject() {
return valueObject;
}
public void setValueObject(TestPojo valueObject) {
this.valueObject = valueObject;
}
@Override
public String toString() {
return "MyClassFor18 (value=" + valueObject + ")";
}
}
private static class TestPojo {
private String name;
private String value;
public TestPojo(String name, String value) {
this.name = name;
this.value = value;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
@Override
public String toString() {
return "TestPojo { name=" + this.name + ", value=" + this.value
+ "}";
}
}
关于java - 将 JSON 类反序列化为不同名称的 Java 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47539267/