使用 GSON 将 JSON 从 serializeArray() 转换为 Java 类

Posted

技术标签:

【中文标题】使用 GSON 将 JSON 从 serializeArray() 转换为 Java 类【英文标题】:Convert JSON from serializeArray() to Java class with GSON 【发布时间】:2014-04-26 15:06:58 【问题描述】:

我在尝试使用 Gson 将 JSON 字符串从序列化 html 表单转换为 Java 类时遇到了一些麻烦。

以下是 JSON 示例:

[
     "name" : "ObjectClass", "value" : "Obama" ,
     "name" : "ObjectType", "value" : "Person" ,
     "name" : "Att_1_name", "value" : "Age" , 
     "name" : "Att_1_value", "value" : "52" , 
     "name" : "Att_2_name", "value" : "Race" ,
     "name" : "Att_2_name", "value" : "African American" 
]

如您所见,它传递一个数组,然后该数组的每个元素由一个名称和一个组成。

我对如何设置我的 Java 类以便 Gson 可以转换它有些迷茫。还应该注意的是,数组中的元素数量是可变的(用户可以有多少属性)。

我在课堂上的(不正确的)尝试是:

package com.test.objectclasses;

import java.util.ArrayList;

public class tempJSON 
    ArrayList<innerJSON> inJSON;

    public ArrayList<innerJSON> getInJSON() 
        return inJSON;
    

    public void setInJSON(ArrayList<innerJSON> inJSON) 
        this.inJSON = inJSON;
    

    public class innerJSON 
        private String name;
        private String value;

        public String getName() 
            return name;
        

        public void setName(String name) 
            this.name = name;
        

        public String getValue() 
            return value;
        

        public void setValue(String value) 
            this.value = value;
        
    

知道如何解决这个问题,还是我认为这一切都错了?提前致谢。

【问题讨论】:

该数组的每个元素都是一个包含两个名称/值对的“对象”(映射)。 (我不知道他们为什么要使用如此愚蠢的方案。)此外,最后一行编码错误——几乎可以肯定它应该是“att_2_value”。 因为它被严重搞砸了,我看不出尝试直接映射到 Java 类的意义。最好将数据分解成一个 Map,例如 "ObjectClass":"Obama",..."att_2_value":"African American",然后,如果您仍然想要一个 Java 类,请从该类中构建一个。 啊,是的!某人所做的是序列化 Map(没有意识到它是 Map 而不是自定义对象)以生成上述 JSON。 Map 在内部是一个名称/值对数组,所以这就是序列化程序产生的。 【参考方案1】:

首先,遵循 Java 命名约定。你的类名应该以大写字母开头。所以上驼峰式。

摆脱封闭类tempJSON 并使用Gson#fromJson(..) 中的类型标记将其标记为List,因为您有一个JSON 数组。

List<innerJSON> innerJSONs = gson.fromJson(yourStream, new TypeToken<List<innerJSON>>().getType());

现在List 将包含与您的 JSON 中一样多的 innerJSON 对象。

【讨论】:

完美运行。感谢您的回答和解释。

以上是关于使用 GSON 将 JSON 从 serializeArray() 转换为 Java 类的主要内容,如果未能解决你的问题,请参考以下文章

Gson toJson 返回 JSON 字符串而不是 JSON 对象

使用 GSON 序列化到 JSON 的类是不是应该实现可序列化接口

用Gson将json转换为List<JavaBean>时,报declares multiple JSON fields named serialVersionUID

如何使用 Gson 将 JSON 转换为 HashMap?

Kotlin 使用 Gson 将 json 字符串转换为对象列表

如何发布使用 GSON 解析大型 json 文件的进度