Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.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
使用GSON将JSON从serializeArray()转换为Java类_Java_Json_Gson_Jsonserializer - Fatal编程技术网

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

使用GSON将JSON从serializeArray()转换为Java类,java,json,gson,jsonserializer,Java,Json,Gson,Jsonserializer,我在尝试使用Gson将JSON字符串从序列化HTML表单转换为Java类时遇到了一些问题 以下是JSON示例: [ { "name" : "ObjectClass", "value" : "Obama" }, { "name" : "ObjectType", "value" : "Person" }, { "name" : "Att_1_name", "value" : "Age" }, { "name" : "Att_1_value", "value" : "

我在尝试使用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;
        }
    }
}
package com.test.objectclasses;
导入java.util.ArrayList;
公共类tempJSON{
阿雷利斯特·英克森;
公共阵列列表getInJSON(){
返回inJSON;
}
公共无效setInJSON(ArrayList inJSON){
this.inJSON=inJSON;
}
公共类innerJSON{
私有字符串名称;
私有字符串值;
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共字符串getValue(){
返回值;
}
公共void设置值(字符串值){
这个值=值;
}
}
}

你知道该怎么做吗,还是我想的全错了?提前感谢。

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

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

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

现在,
列表
将包含与JSON中显示的一样多的
innerJSON
对象。

该数组的每个元素都是一个“对象”(Map),包含两个名称/值对。(他们为什么使用如此愚蠢的方案,我不知道。)另外,最后一行代码错误——几乎可以肯定它应该是“att_2_value”。因为它被搞得一团糟,我看不到直接映射到Java类的意义。最好将数据分解成一个映射,例如,
{“ObjectClass”:“Obama”,…“att_2_value”:“African American”}
,然后,如果您仍然想要一个Java类,就从中构建一个。啊,是的!!有人所做的是序列化一个映射(没有意识到它是一个映射而不是一个自定义对象)来生成上面的JSON。映射在内部是一个名称/值对数组,因此序列化程序就是这样生成的。工作得非常好。谢谢你的回答和解释。