将JSON字符串转换为Java对象列表

时间:2018-01-13 06:17:37

标签: java android json gson

我有一个简单的JSON字符串,格式为:

{
  "obj_1": {
    "k1": "v1",
    "k2": "v2",
    "k3": "v3"
  },
  "obj_2": {
    "k1": "v1",
    "k2": "v2",
    "k3": "v3"
  }
}

一个代表每个JSON对象的类,如下所示:

public class SomeObject {

public int k1;
public String k2;
public String k3;

public Constructor(int k1, String k2, String k3) {
    this.k1 = k1;
    this.k2 = k2;
    this.k3 = k3;
}

我想将JSON对象读入这些对象的数组,而不必使用while循环,因为这需要很长时间。

JSONObject jsonObject = new JSONObject(jsonString);
SomeObject[] objectsList = gson.fromJson(jsonObject.toString(), SomeObject[].class);

主要思想是将每个JSON对象填充到Java类中,然后填充到SomeObject数组中。这样在数组内部我就可以访问每个对象并使用方法访问属性。

我最终收到错误消息:

can't make objects of type SomeObject[]

5 个答案:

答案 0 :(得分:1)

您的输入字符串应如下所示,以获得SomeObject列表

{
    [{
            "k1": 1,
            "k2": "v2",
            "k3": "v3"
        }, {
            "k1": 2,
            "k2": "v2",
            "k3": "v3"
        }
    ]
}

下面的代码应该有用..

JSONObject jsonObject = new JSONObject(jsonString);
SomeObject[] objectsList = gson.fromJson(jsonObject.toString(), SomeObject[].class);

对于给定的JSON字符串,您可以这样处理(将toString()添加到SomeObject以显示它)...

import java.util.LinkedList;
import java.util.List;
import java.util.Map.Entry;

import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

public class TestClass {

    public static void main(String[] args) {
        List<SomeObject> list = new LinkedList<SomeObject>();
        String jsonString = "{\"obj_1\":{\"k1\":1,\"k2\":\"v2\",\"k3\":\"v3\"},\"obj_2\":{\"k1\":2,\"k2\":\"v2\",\"k3\":\"v3\"}}";
        Gson gson = new Gson();
        JsonObject jsonObject = new JsonParser().parse(jsonString).getAsJsonObject();
        for (Entry<String, JsonElement> entry : jsonObject.entrySet()) {
            // note entry.getKey() will be obj_1, obj_2, etc.
            SomeObject item = gson.fromJson(entry.getValue().getAsJsonObject(), SomeObject.class);
            list.add(item);
        }
        System.out.println(list);
    }
}

示例运行

[SomeObject [k1=1, k2=v2, k3=v3], SomeObject [k1=2, k2=v2, k3=v3]]

注意: k1的值必须是数字且没有引号,因为在SomeObject中k1被声明为int

答案 1 :(得分:0)

您的JSON结构是地图, 如果你想要一个数组或列表 使用     [{},{}] 它是JSON中用于数组或列表的结构

答案 2 :(得分:0)

1.你应该让你的班级成为这样的吸气者和制定者:

public class SomeObject {

    public int k1;
    public String k2;
    public String k3;

    public int getK1() {
        return k1;
    }

    public String getK2() {
        return k2;
    }

    public String getK3() {
        return k3;
    }

    public void setK1(int k1) {
        this.k1 = k1;
    }

    public void setK2(String k2) {
        this.k2 = k2;
    }

    public void setK3(String k3) {
        this.k3 = k3;
    }
}

您可以轻松地将JSON字符串转换为JSONObject。之后使用以下代码进行模态objecgt并将值设置为模态对象的变量:

 try {
          JSONObject jsonObjectData = new JSONObject(YOUR_JSON_STRING);
        SomeObject object = new SomeObject();
    object.setK1(1);
    object.setK2("test 1");
    object.setK3("test 2");
    List<SomeObject> objectList = new  ArrayList<>();
    objectList.add(object);
   }catch (JSONException e){
            e.printStackTrace();
  }

答案 3 :(得分:0)

您发布的JSON似乎与动态类型相似,即您没有固定密钥,因为您不能简单地使用make-array。你必须手动遍历它。

如果您使用的是GSON,请执行此类操作。

public ArrayList getArray(String json){
  ArrayList<SomeObject> list = new ArrayList<>();
  Gson gson = new Gson();
  JsonObject obj = new JsonParser().parse(json).getAsJsonObject();
  for(Map.Entry<String,JsonElement> entry:obj.entrySet()){
      //parse json 
     SomeObject some = gson.fromJson(entry.getValue().getAsJsonObject(), SomeObject.class); 
      //here add to list
      list.add(some);
  }
 return list;
}

注意:示例代码未经过测试。

答案 4 :(得分:0)

为什么不创建JSONObjects的ArrayList?

ArrayList <JSONObject> objectsList = new ArrayList<JSONObject>();
objectsList .add(jsonObject);