【问题标题】:Why does Gson toJson always return null? [duplicate]为什么Gson toJson总是返回null? [复制]
【发布时间】:2017-01-25 02:34:21
【问题描述】:

当我尝试将基本对象转换为 json 时,我尝试过的所有操作似乎都返回 null。怎么了?

Person.java

public class Person {
    public String Name;
    public String Address;
}

主要代码

Person person = new Person() {
    {
        Name = "John";
        Address = "London";
    }
};

Gson gson = new Gson();
String jsonPerson = gson.toJson(person);

【问题讨论】:

  • 不起作用,因为您的基类上没有构造函数...只需在 Address 之后添加一个无参数构造函数,例如:Person(){} 并重试...
  • 至少发布实际的可编译代码
  • 对于那些否决我的答案的人,仅仅因为 OP 是初学者并不会使这个问题成为一个坏问题,当然也不会让我的答案变坏。如果需要,标记/投票以关闭为重复

标签: java android serialization gson


【解决方案1】:

Gson 不支持序列化匿名类型。

查看由 Sotirios Delimanolis 链接的副本。请注意,您使用的双括号初始化程序有效地创建了一个匿名子类,它有一些令人讨厌的副作用,例如每次使用它时都会创建新类,以及破坏 Gson 之类的东西。

如果你像这样创建一个构造函数,它会起作用:

class Ideone
{
    public class Person {
        public String Name;
        public String Address;

        public Person(String Name, String Address) {
            this.Name = Name;
            this.Address = Address;
        }
    }

    public static void main (String[] args) throws java.lang.Exception
    {
        Person person = new Person("John", "London");

        // System.out.println(person.Name);
        Gson gson = new Gson();
        String jsonPerson = gson.toJson(person);
    }
}

顺便说一句,你不应该用大写字母命名你的字段;类以大写字母开头,字段以小写字母开头。

Have a look at the Google Java Style Guide for a good reference on naming conventions

【讨论】:

  • 这很奇怪,它正在为我编译,而不是抛出异常并在这些语句之后继续编码。不过,您的解决方案已经为我解决了这个问题,因此感谢您提供的样式指南文档
  • -1 您忘记了 Java 的初始化程序块(请参阅the question you linked to),它们经常用于模拟构造函数的命名参数。 See this actually runnable version of your code 使用 OP 问题中的初始化程序块,并将嵌套的 Person 类声明为静态,以便可以在 main 中引用它。
【解决方案2】:

您实例化对象的方式会创建一个匿名类,因此您可以释放类型。您可以改用TypeToken 来解决此问题,如下所示

Type personType = new TypeToken<Person>(){}.getType();
Gson gson = new Gson();
String jsonPerson = gson.toJson(person, personType);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-12
    • 2019-09-18
    • 2014-09-02
    • 2015-02-27
    • 2021-01-10
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    相关资源
    最近更新 更多