【问题标题】:Gson to pojo serialization of inner classGson to pojo 内部类的序列化
【发布时间】:2017-07-13 11:54:43
【问题描述】:

我正在尝试使用 Gson 的能力将 json 转换为 POJO。我让它与序列化类一起工作,作为一个单独的包中的一个类,但现在我试图让序列化类成为调用它的类的内部类,就像我在下面描述的那样。

public class A {
    private final Gson gson;

    public A() {
        gson = new GsonBuilder().serializeNulls().create();
    }

    public void foo(String json){
        B b = gson.fromJson(json, B.class);
    }

    public static class B {
         private String bar;

         public String getBar(){
             return bar;
         }
    }
}

示例 JSON:

{"bar": "test"}

此设置为内部类变量返回空值;在这种情况下,只是吧。在本例中,我已确保传入的 json 与 B 类中的变量名称相匹配。此外,我尝试过使内部类成为非静态和私有的,但没有成功。据我了解,它需要是一个静态类才能使用 gson 对其进行序列化。有什么明显的事情表明我做错了,你可以看到吗?

【问题讨论】:

  • 可能是您缺少 bar 的二传手吗?你能发布一个示例 JSON 吗?
  • 没想到是因为这些是我在单独的包而不是内部类中工作时所拥有的确切类。无论如何,继续尝试并没有任何运气。我将编辑我的帖子以添加示例 JSON。
  • 你为什么要把gson作为foo函数的一个参数,而所有发生的事情就是它会立即被覆盖?
  • 我实际上在我的代码中的其他地方也发生过这种情况,我只是添加了它以显示它被设置的内容,因为正如我发现早期的问题,它必须有 serializeNulls() 方法在其中

标签: java json serialization gson


【解决方案1】:

错误在其他地方。您传递的String 或Gson 很可能配置错误。我粘贴了完全相同的代码,它对我来说很好:

public class Main {

    public static void main (String[] args) {
        new A().foo("{\"bar\": \"test\"}");
    }

    public static class A {
        private final Gson gson;

        public A() {
            gson = new GsonBuilder().serializeNulls().create();
        }

        public void foo(String json){
            B b = gson.fromJson(json, B.class);
            System.out.println(b);
        }

        public static class B {
            private String bar;

            public String getBar(){
                return bar;
            }

            @Override
            public String toString() {
                return "B{bar='" + bar + '\'' +
                        '}';
            }
        }
    }

}

内部类应该可以工作,所以问题出在其他地方。这将打印出来:

B{bar='test'}

【讨论】:

  • 在我实际拥有的代码中,与我为问题制作的简化版本相反,gson 在这种情况下设置在class A 的构造函数中。我将编辑我的问题以更准确地反映这一点——我认为简化不会是一个问题。
  • 我的回答仍然有效。查看更新。您在其他地方遇到问题可能是您将错误的字符串传递给foo。
  • 刚刚想通了。与我传入的字符串有关 - 我想这是一个常见问题,我会在几秒钟内发布我的答案。
  • 如果答案对您有用,您可以点赞/接受。
  • 我做到了!不幸的是,我目前的声望不到 15,因为我的帐户基本上不能用于发布和回复,因此不会显示。
【解决方案2】:

所以我想这是一个常见的问题,现在我已经遇到了两次。问题在于传入的 JSON 字符串。我将 JSON 从某处复制并粘贴到命令行中。结果,报价没有被注册为有效的引号。它是“,而不是"。第二个是注册为引号的内容。感谢大家的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    相关资源
    最近更新 更多