当前位置: 首页 > 知识库问答 >
问题:

将JSON类反序列化为不同名称的Java类

沈自珍
2023-03-14

我之前的问题没有得到任何结果,可能是我问得不对,或者太详细了。

现在我的基本问题是,如何将一个具有一个类名的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"
}

共有1个答案

皇甫建木
2023-03-14

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

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

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

因此,如果服务器返回像show这样的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
                + "}";
    }
}
 类似资料:
  • 问题内容: 是否可能:在类中有一个字段,而在Jackson库中进行序列化/反序列化时却为其使用不同的名称? 例如,我有“ Coordiantes”类。 对于从JSON反序列化,希望具有以下格式: 但是当我序列化对象时,结果应该是这样的: 我试图通过在getter和setter上都应用注释(具有不同的值)来实现此目的: 但我有一个例外: org.codehaus.jackson.map.exc.Un

  • 问题内容: 我在这里发现了同样的问题… …但是没有正确的答案。 最好的建议之一是将嵌套对象包装到新类中,但是这种方法引入了另一个问题:乐高名称。 在我的示例中,此类的最逻辑名称是与父类相同的名称,当然这是不可能的。我的示例很简单,我只想消除父类中的“语言”属性。有人可以帮我做吗? json的示例: 问题答案: 如果JSON属性名称与c#命名约定冲突,则可以在序列化期间使用或批注替换其他名称。 例如

  • 我有一个通过RabbitMQ作为消息发送的类,在sender服务上,它的定义如下: 并且在接收方服务上: 在receiver controller中,我有以下方法,它应该接受该消息,将其转换为一个对象,并将其保存在数据库中,看起来如下所示: 编辑:根据请求添加堆栈跟踪。

  • 问题内容: 我有一个像这样的POJO,我正在使用GSON序列化为JSON: 这是我的做法: 现在我的json将是这样的: 现在我的问题是:有什么办法可以代替更改变量名呢?在Gson中,我可以在变量顶部使用任何注释吗? 我想要这样的东西: 问题答案: 您可以使用@SerializedName(“ client_id”) 编辑: 您也可以使用它,以通用方式更改所有字段

  • 我想实现一个功能,其中请求映射到正确的对象。是否有一种方法(除了自定义反序列化器)可以将请求按类型/基数映射到适当的对象?任何见解都将不胜感激!

  • 有没有办法将类序列化为json,但只使用我想在特定情况下使用的字段,而不需要创建类的多个变体?让我们举个例子: 现在,在我的一个方法中,我希望有一个到json对象的映射,该对象只包含name、city和anotherDummyString。 在第二种方法中,我想有姓氏和城市。在第三种方法中...... 有什么愉快而巧妙的方法来实现这一点吗?我想知道我是否可以“隐藏”这些我不需要的字段。