我有一个简单的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[]
答案 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);