Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用GSON进行自定义序列化?_Java_Json_Gson - Fatal编程技术网

Java 如何使用GSON进行自定义序列化?

Java 如何使用GSON进行自定义序列化?,java,json,gson,Java,Json,Gson,我有一个案例,我想使用GSON自定义序列化功能 class Student{ public String name; public int rollNumber; public Student(String name, int rollNumber){ this.name = name; this.rollNumber = rollNumber; } public int getRollNumber(){ retur

我有一个案例,我想使用GSON自定义序列化功能

class Student{
   public String name;
   public int rollNumber;

   public Student(String name, int rollNumber){
        this.name = name;
        this.rollNumber = rollNumber;
   }

   public int getRollNumber(){
       return this.rollNumber;
   }

   public String getName(){
       return this.name;
   }


}
class School{

    public Student[] students;

    public School(Student[] students){
          this.students = students;
    }


   public Students[] getStudents(){
       return this.students;
   }

}
现在当我这么做的时候

private static final Gson GSON = new GsonBuilder().disableHtmlEscaping().create();
Student[]Student=新生[2]

students[0] = new Student("sam", 1);

students[1] = new Student("tom", 2);

School school = new School(students);

GSON.toJson(school);
我得到如下输出:

[{"name":"sam","rollNumer":1},{"name":"tom","rollNumer":2}]
[{"student":{"name":"sam","rollNumer":1}}, {"student":{"name":"tom","rollNumer":2}}]
{"name":"sam", "rollNumer":1}
public Map<String, Student> students;
Student student = new Student("sam", 1);
students.put("student", student);
//add other students...
但我希望它是:

["student":{"name":"sam","rollNumer":1},"student":{"name":"tom","rollNumer":2}]
如何使用GSON自定义序列化实现这一点


我试了又试。但是没有太大帮助。

首先,您无法以[“学生”:{“名称”:“sam”,“rollNumer”:1},“学生”:{“名称”:“tom”,“rollNumer”:2}]的形式获得输出,因为您试图将对象转换为json而不是对象数组

我尝试了你的代码,我得到了以下输出

{“学生”:[{“姓名”:“山姆”,“罗尔号码”:1},{“姓名”:“汤姆”,“罗尔号码”:2}]}

以下是代码:

    Student[] students = new Student[2];

    students[0] = new Student("sam", 1);

    students[1] = new Student("tom", 2);

    School school = new School(students);

    Gson gson = new GsonBuilder().disableHtmlEscaping().create();

    System.out.println(gson.toJson(school));

首先,您无法以[“学生”:{“名称”:“sam”,“rollNumer”:1},“学生”:{“名称”:“tom”,“rollNumer”:2}]的形式获得输出,因为您试图将对象转换为json而不是对象数组

我尝试了你的代码,我得到了以下输出

{“学生”:[{“姓名”:“山姆”,“罗尔号码”:1},{“姓名”:“汤姆”,“罗尔号码”:2}]}

以下是代码:

    Student[] students = new Student[2];

    students[0] = new Student("sam", 1);

    students[1] = new Student("tom", 2);

    School school = new School(students);

    Gson gson = new GsonBuilder().disableHtmlEscaping().create();

    System.out.println(gson.toJson(school));
这个

不是有效的JSON(您可以使用类似的在线工具亲自验证)。详情请参阅:

对象的定义:

对象是一组无序的名称/值对。对象以{(左大括号)开始,以}(右大括号)结束。每个名称后面跟有:(冒号),名称/值对之间用(逗号)分隔

数组的定义:

数组是值的有序集合。数组以[(左括号)开始,以](右括号)结束。值之间用(逗号)分隔

值的定义:

值可以是双引号中的字符串、数字、true或false或null、对象或数组。这些结构可以嵌套

您的输出定义了一个JSON数组,但该数组中的对象没有正确地用大括号括起来。正确的表示形式如下所示:

[{"name":"sam","rollNumer":1},{"name":"tom","rollNumer":2}]
[{"student":{"name":"sam","rollNumer":1}}, {"student":{"name":"tom","rollNumer":2}}]
{"name":"sam", "rollNumer":1}
public Map<String, Student> students;
Student student = new Student("sam", 1);
students.put("student", student);
//add other students...
可以使用此简单的Gson生成:

和“相关”输出:

{"students":[{"student":{"name":"sam","rollNumber":1}},{"student":{"name":"tom","rollNumber":2}}]}
这个

不是有效的JSON(您可以使用类似的在线工具亲自验证)。详情请参阅:

对象的定义:

对象是一组无序的名称/值对。对象以{(左大括号)开始,以}(右大括号)结束。每个名称后面跟有:(冒号),名称/值对之间用(逗号)分隔

数组的定义:

数组是值的有序集合。数组以[(左括号)开始,以](右括号)结束。值之间用(逗号)分隔

值的定义:

值可以是双引号中的字符串、数字、true或false或null、对象或数组。这些结构可以嵌套

您的输出定义了一个JSON数组,但该数组中的对象没有正确地用大括号括起来。正确的表示形式如下所示:

[{"name":"sam","rollNumer":1},{"name":"tom","rollNumer":2}]
[{"student":{"name":"sam","rollNumer":1}}, {"student":{"name":"tom","rollNumer":2}}]
{"name":"sam", "rollNumer":1}
public Map<String, Student> students;
Student student = new Student("sam", 1);
students.put("student", student);
//add other students...
可以使用此简单的Gson生成:

和“相关”输出:

{"students":[{"student":{"name":"sam","rollNumber":1}},{"student":{"name":"tom","rollNumber":2}}]}

根据你的课程,你得到了正确的结果

您的对象
Student
如下所示:

[{"name":"sam","rollNumer":1},{"name":"tom","rollNumer":2}]
[{"student":{"name":"sam","rollNumer":1}}, {"student":{"name":"tom","rollNumer":2}}]
{"name":"sam", "rollNumer":1}
public Map<String, Student> students;
Student student = new Student("sam", 1);
students.put("student", student);
//add other students...
很简单,JSON中的对象被
{}
包围,并包含属性/值对

然后,JSON中的数组被
[]
包围,并包含许多用逗号分隔的对象/值。由于您有一个
Student
数组,因此您只需要像上面的一个那样的多个对象,这些对象之间用逗号分隔,所有对象都被
[]
包围

这正是你所拥有的。。。一切都有道理

好的,您希望JSON在每个
student
对象之前包含
“student”
,但是这个字符串是什么?它来自哪里?事实上,在您的类中没有这样的字符串,那么您希望Gson(或任何库)如何将其包含在JSON中呢

如果您确实需要该字符串,您需要以某种方式将其包含在类中,我提出的最简单的方法是使用
Map
而不是数组,如下所示:

[{"name":"sam","rollNumer":1},{"name":"tom","rollNumer":2}]
[{"student":{"name":"sam","rollNumer":1}}, {"student":{"name":"tom","rollNumer":2}}]
{"name":"sam", "rollNumer":1}
public Map<String, Student> students;
Student student = new Student("sam", 1);
students.put("student", student);
//add other students...
请注意,现在您确实有了字符串
“student”
,该字符串与学生关联,作为地图中的键

现在,你或多或少会得到你想要的结果,但并不完全如此!因为整个东西将被
{}
包围,而不是
[]
,因为
映射是一个对象,而不是数组

{"student":{"name":"sam","rollNumer":1}},{"student":{"name":"tom","rollNumer":2}}

恐怕你想要的回复是不可能的(据我所知)

根据你的课程,你得到了正确的结果

您的对象
Student
如下所示:

[{"name":"sam","rollNumer":1},{"name":"tom","rollNumer":2}]
[{"student":{"name":"sam","rollNumer":1}}, {"student":{"name":"tom","rollNumer":2}}]
{"name":"sam", "rollNumer":1}
public Map<String, Student> students;
Student student = new Student("sam", 1);
students.put("student", student);
//add other students...
很简单,JSON中的对象被
{}
包围,并包含属性/值对

然后,JSON中的数组被
[]
包围,并包含许多用逗号分隔的对象/值。由于您有一个
Student
数组,因此您只需要像上面的一个那样的多个对象,这些对象之间用逗号分隔,所有对象都被
[]
包围

这正是你所拥有的。。。一切都有道理

好的,您希望JSON在每个
student
对象之前包含
“student”
,但是这个字符串是什么?它来自哪里?事实上,在您的类中没有这样的字符串,那么您希望Gson(或任何库)如何将其包含在JSON中呢

如果您确实需要该字符串,您需要以某种方式将其包含在类中,我提出的最简单的方法是使用
Map
而不是数组,如下所示:

[{"name":"sam","rollNumer":1},{"name":"tom","rollNumer":2}]
[{"student":{"name":"sam","rollNumer":1}}, {"student":{"name":"tom","rollNumer":2}}]
{"name":"sam", "rollNumer":1}
public Map<String, Student> students;
Student student = new Student("sam", 1);
students.put("student", student);
//add other students...
请注意,现在您确实有了字符串
“student”
,该字符串与学生关联,作为地图中的键

现在,你或多或少会得到你想要的结果,但并不完全如此!因为整个事物将被
{}
包围,而不是
[]
,因为
映射是一个对象,而不是