为什么Gson toJson总是返回null?

Kar*_*een 7 java serialization android gson

当我尝试将基本对象转换为json时,它似乎返回null我尝试过的所有内容.怎么了?

Person.java

public class Person {
    public String Name;
    public String Address;
}
Run Code Online (Sandbox Code Playgroud)

主要代码

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

Gson gson = new Gson();
String jsonPerson = gson.toJson(person);
Run Code Online (Sandbox Code Playgroud)

dur*_*597 13

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

请查看Google Java样式指南,以获取有关命名约定的良好参考

  • -1你忘记了Java的初始化程序块(参见[你链接到的问题](http://stackoverflow.com/a/1988268/1521179)),它们常用于模拟构造函数的*命名参数.[请参阅这个实际可运行的代码版本](https://ideone.com/mHWoD8),在OP的问题中使用初始化程序块,并将嵌套的`Person`类声明为静态,以便可以在`main中引用它`. (2认同)

blu*_*lue 5

实例化对象的方式创建了一个匿名类,因此您失去了类型。您可以使用 aTypeToken来解决此问题,如下所示

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