为什么 Gson toJson 总是返回 null?Gson 不支持序列化匿名类型。

2022-09-04 07:46:01

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

人.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);

答案 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);
    }
}

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

查看 Google Java 样式指南,了解有关命名约定的良好参考


答案 2

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

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