为什么Gson的toJson方法总是返回null?

13

当我试图将一个基本对象转换为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(){},然后再试一次... - Hackerman
1
请提供实际可编译的代码,至少要发布实际可编译的代码。 - njzk2
1
对于那些给我的回答点踩的人,仅仅因为提问者是初学者并不意味着这是一个糟糕的问题,也绝对不意味着我的回答不好。如果你想的话可以标记/投票关闭为重复问题。 - durron597
2个回答

22

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风格指南以获取良好的命名约定参考。


很奇怪,它在我这里编译通过了,没有抛出异常并且在那些语句之后继续执行代码。不过你的解决方案已经修复了它,所以谢谢你和风格指南文档。 - Karl Green
2
-1 你忘记了Java的初始化块(参见你链接到的问题),它们经常用于模拟构造函数的命名参数。查看这个实际可运行的代码版本,它使用了一个初始化块,就像OP的问题一样,并将嵌套的Person类声明为静态类,以便在main中引用。 - amon

5
您实例化对象的方式创建了一个匿名类,因此您失去了类型信息。您可以使用来解决这个问题,具体做法如下:
Type personType = new TypeToken<Person>(){}.getType();
Gson gson = new Gson();
String jsonPerson = gson.toJson(person, personType);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接