【问题标题】:Deserialize JSON class to Java class of different name将 JSON 类反序列化为不同名称的 Java 类
【发布时间】:2017-11-28 19:16:37
【问题描述】:

我之前关于这个的问题并没有真正得到任何地方,也许我没有问正确的问题或者它太详细了。

我现在的基本问题是,如何将具有一个类名的 JSON 对象反序列化为具有不同类名的 Java 对象?

例如,服务器发送/期望的 JSON 类是“18”(我对此的控制为零)。我的 Java 类不能是“18”,所以它是“_18”。

即使使用不同的命名策略,只需执行 new Gson().fromJson() 也无济于事; _18 对象始终为空。从那以后,我已经阅读了有关类型适配器和不同注释的信息,但仍不清楚如何解决这个问题。似乎最明智的方法@SerializedName,显然不能用于类本身,只能用于字段成员。

如何将具有名为 18 的类的 JSON 对象反序列化为名为 _18 的 Java 类(或者更好的是,如果可能的话,我可以给该类起一个真实的名称)?

示例 JSON,按请求:

"18": {
    "field1": "value1",
    "field2": "value2",
    "field3": "value3"
}

【问题讨论】:

  • 你能发布一个你正在处理的 JSON 样本吗?
  • 在编辑中添加了示例 JSON。
  • 使用地图: "18" 将是地图的键。

标签: java json gson


【解决方案1】:

首先 - JSON 没有类的概念 - 它是一个对象的字符串表示。 因此,您的示例只是格式错误的 JSON。应该是这样的:

{"18":
 {
  "field1": "value1",
  "field2": "value2",
  "field3": "value3"
  }
}

这是一个有效的 JSON 对象,字段为“18”,属于另一个具有 field1field2field3 属性的类。

所以,如果服务器返回 JSON 字符串,如您的节目 - 要解析它,您必须用 {} 包围它,然后您的 Java 类将具有“18”的属性,因为您想通过 @SerializedName 注释为 Java 命名它.

请参阅下面的示例测试用例:

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
                + "}";
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多