如何将 List<class> 放入 JSONObject 然后读取该对象?

Posted

技术标签:

【中文标题】如何将 List<class> 放入 JSONObject 然后读取该对象?【英文标题】:How to put a List<class> into a JSONObject and then read that object? 【发布时间】:2011-10-29 06:41:06 【问题描述】:

我有一个List&lt;class&gt;,我想将其转换为 json 对象,然后从 json 对象中遍历数据。

如果这只是list&lt;String&gt;,我可以这样做:

JSONObject obj = new JSONObject();
List<String> sList = new ArrayList<String>();
sList.add("val1");
sList.add("val2");

obj.put("list", sList);

然后我可以像这样遍历列表:

JSONArray jArray = obj.getJSONArray("list");
for(int ii=0; ii < jArray.size(); ii++
  System.out.println(jArray.getString(ii));

使用该类的问题是我需要访问list&lt;class&gt; 的每个类元素中的数据,而我不知道如何将其编码/遍历成 JSON。任何帮助将不胜感激。

【问题讨论】:

您使用的是哪个JSONObject 类?有几个…… 好点,我以为是 org.json 类。 【参考方案1】:

请致电 getJSONObject() 而不是 getString()。这将为您提供数组中 JSON 对象的句柄,然后您可以从那里获取对象的属性。

例如,要从List&lt;SomeClass&gt; 中获取属性“值”,其中SomeClass 具有String getValue()setValue(String value)

JSONObject obj = new JSONObject();
List<SomeClass> sList = new ArrayList<SomeClass>();

SomeClass obj1 = new SomeClass();
obj1.setValue("val1");
sList.add(obj1);

SomeClass obj2 = new SomeClass();
obj2.setValue("val2");
sList.add(obj2);

obj.put("list", sList);

JSONArray jArray = obj.getJSONArray("list");
for(int ii=0; ii < jArray.length(); ii++)
  System.out.println(jArray.getJSONObject(ii).getString("value"));

【讨论】:

不要为我工作。我无法从 jsonObject 解析数组。 JSONArray jArray = obj.getJSONArray("list");会给我一个例外。 JSONArray list = new JSONArray(iconIds); obj.put("列表", 列表);这行得通。我可以从 obj JSONArray jArray = obj.getJSONArray("list"); 解析数组【参考方案2】:

让我们假设类是 Data,有两个对象 namedob 都是 strings

首先,检查列表是否为空。然后,将列表中的对象添加到 JSONArray

JSONArray allDataArray = new JSONArray();
List<Data> sList = new ArrayList<String>();

    //if List not empty
    if (!(sList.size() ==0)) 

        //Loop index size()
        for(int index = 0; index < sList.size(); index++) 
            JSONObject eachData = new JSONObject();
            try 
                eachData.put("name", sList.get(index).getName());
                eachData.put("dob", sList.get(index).getDob());
             catch (JSONException e) 
                e.printStackTrace();
            
            allDataArray.put(eachData);
        
     else 
        //Do something when sList is empty
    

最后,将 JSONArray 添加到 JSONObject

JSONObject root = new JSONObject();
    try 
        root.put("data", allDataArray);
     catch (JSONException e) 
        e.printStackTrace();
    

您也可以进一步将这些数据作为字符串获取。

String jsonString = root.toString();

【讨论】:

【参考方案3】:

您可以使用像 flexjson 这样的 JSON 序列化器/反序列化器来为您进行转换。

【讨论】:

感谢您的建议,但如果可以的话,我想不惜一切代价避免使用序列化程序。 好的,既然你想坚持使用 JSONArray 和 JSONObject,我提供了一个替代答案。【参考方案4】:

这就是我使用 Google Gson 的方式。我不确定是否有更简单的方法可以做到这一点。(有或没有外部库)。

 Type collectionType = new TypeToken<List<Class>>() 
                 // end new
                        .getType();

                String gsonString = 
                new Gson().toJson(objList, collectionType);

【讨论】:

【参考方案5】:

只是为了更新这个线程,这里是如何将一个列表(作为一个 json 数组)添加到 JSONObject 中。 请用您的班级名称替换 YourClass;

List<YourClass> list = new ArrayList<>();
JSONObject jsonObject = new JSONObject();

org.codehaus.jackson.map.ObjectMapper objectMapper = new 
org.codehaus.jackson.map.ObjectMapper();
org.codehaus.jackson.JsonNode listNode = objectMapper.valueToTree(list);
org.json.JSONArray request = new org.json.JSONArray(listNode.toString());
jsonObject.put("list", request);

【讨论】:

以上是关于如何将 List<class> 放入 JSONObject 然后读取该对象?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter - 如何将 List<Uint8List> 放入共享首选项中?

创建缓存时如何将所有缓存名称及其数据放入 List<> 中?

java spring 获取配置文件,并放入一个list 对象中

如何将 XML 反序列化为 list<class>

c#如何将查询后的结果放入list中

如何从 Map<String, List<String>> 获取数组值并放入 setOnMarkerClickListener?