【问题标题】:JSON - Iterate through JSONArrayJSON - 遍历 JSONArray
【发布时间】:2011-10-05 13:04:18
【问题描述】:

我有一个 JSON 文件,其中包含一些数组。我想遍历文件数组并获取它们的元素和值。

这是我的文件的样子:

{
"JObjects": {
    "JArray1": [
        {
            "A": "a",
            "B": "b",
            "C": "c"
        },
        {
            "A": "a1",
            "B": "b2",
            "C": "c3",
            "D": "d4"
            "E": "e5"
        },
        {
            "A": "aa",
            "B": "bb",
            "C": "cc",
            "D": "dd"
        }

    ]
}

}       

这是我已经走了多远:

JSONObject object = new JSONObject("json-file.json");
JSONObject getObject = object.getJSONObject("JObjects");
JSONArray getArray = getObject.getJSONArray("JArray1");

for(int i = 0; i < getArray.length(); i++)
{
      JSONObject objects = getArray.getJSONArray(i);
      //Iterate through the elements of the array i.
      //Get thier value.
      //Get the value for the first element and the value for the last element.
}

有可能做这样的事情吗?

我之所以要这样做是因为文件中的数组具有不同数量的元素。

【问题讨论】:

  • 您使用的是 org.json API,还是其他 Java-to/from-JSON 库?
  • 如果您使用的是org.json.simple.JSONArray,那么访问JSONArray列表的第i个值是getArray.get(i)

标签: java json


【解决方案1】:

改变

JSONObject objects = getArray.getJSONArray(i);

JSONObject objects = getArray.getJSONObject(i);

或到

JSONObject objects = getArray.optJSONObject(i);

取决于您使用的 JSON-to/from-Java 库。 (看起来getJSONObject 适合你。)

然后,要访问“对象”JSONObject 中的字符串元素,请按元素名称取出它们。

String a = objects.get("A");

如果您需要JSONObject 中的元素名称,可以使用静态实用方法JSONObject.getNames(JSONObject) 来完成。

String[] elementNames = JSONObject.getNames(objects);

“获取第一个元素的值和最后一个元素的值。”

如果“元素”指的是数组中的组件,请注意第一个组件的索引为 0,最后一个组件的索引为 getArray.length() - 1


我想遍历数组中的对象并获取它们的组件和它们的值。在我的示例中,第一个对象有 3 个组件,第二个对象有 5 个,第三个对象有 4 个组件。我想遍历它们中的每一个并获取它们的组件名称和值。

下面的代码正是这样做的。

import org.json.JSONArray;
import org.json.JSONObject;

public class Foo
{
  public static void main(String[] args) throws Exception
  {
    String jsonInput = "{\"JObjects\":{\"JArray1\":[{\"A\":\"a\",\"B\":\"b\",\"C\":\"c\"},{\"A\":\"a1\",\"B\":\"b2\",\"C\":\"c3\",\"D\":\"d4\",\"E\":\"e5\"},{\"A\":\"aa\",\"B\":\"bb\",\"C\":\"cc\",\"D\":\"dd\"}]}}";

    // "I want to iterate though the objects in the array..."
    JSONObject outerObject = new JSONObject(jsonInput);
    JSONObject innerObject = outerObject.getJSONObject("JObjects");
    JSONArray jsonArray = innerObject.getJSONArray("JArray1");
    for (int i = 0, size = jsonArray.length(); i < size; i++)
    {
      JSONObject objectInArray = jsonArray.getJSONObject(i);

      // "...and get thier component and thier value."
      String[] elementNames = JSONObject.getNames(objectInArray);
      System.out.printf("%d ELEMENTS IN CURRENT OBJECT:\n", elementNames.length);
      for (String elementName : elementNames)
      {
        String value = objectInArray.getString(elementName);
        System.out.printf("name=%s, value=%s\n", elementName, value);
      }
      System.out.println();
    }
  }
}
/*
OUTPUT:
3 ELEMENTS IN CURRENT OBJECT:
name=A, value=a
name=B, value=b
name=C, value=c

5 ELEMENTS IN CURRENT OBJECT:
name=D, value=d4
name=E, value=e5
name=A, value=a1
name=B, value=b2
name=C, value=c3

4 ELEMENTS IN CURRENT OBJECT:
name=D, value=dd
name=A, value=aa
name=B, value=bb
name=C, value=cc
*/

【讨论】:

  • 程序员布鲁斯:我不想获取特定元素的名称,我想检查数组是否有 4 个元素,然后获取它们的名称和值,或者如果数组有 5 个元素然后获取他们的名字和价值。
  • 您是在检查数组是否有 4 个对象组件,或者数组中的一个对象是否有 4 个元素?要检查数组中对象组件的数量,请使用 getArray.length()。要检查 JSON 对象中的元素数量,可以使用 JSONObject.getNames(objects).length。
  • 我想遍历数组中的对象并获取它们的组件和它们的值。在我的示例中,第一个对象有 3 个组件,第二个对象有 5 个,第三个对象有 4 个组件。我想遍历它们中的每一个并获取它们的组件名称和值。
  • 你不断改变需求。执行您想要的操作所需的所有代码片段都已发布在此页面上。
  • 来自python,看来要回汇编了!
【解决方案2】:
for (int i = 0; i < getArray.length(); i++) {
            JSONObject objects = getArray.getJSONObject(i);
            Iterator key = objects.keys();
            while (key.hasNext()) {
                String k = key.next().toString();
                System.out.println("Key : " + k + ", value : "
                        + objects.getString(k));
            }
            // System.out.println(objects.toString());
            System.out.println("-----------");

        }

希望这对某人有所帮助

【讨论】:

  • 非常感谢!你让我今天一整天都感觉很好 !我找不到在不知道密钥的情况下循环 JSONArray 的示例!
【解决方案3】:
JsonArray jsonArray;
Iterator<JsonElement> it = jsonArray.iterator();
while(it.hasNext()){
    System.out.println(it.next());
}

【讨论】:

  • 我在我的情况下尝试了你的方法,我检索到以下错误:cannot find symbol method iterator()
【解决方案4】:
for(int i = 0; i < getArray.size(); i++){
      Object object = getArray.get(i);
      // now do something with the Object
}

你需要检查类型:

值可以是以下任何类型:Boolean、JSONArray、JSONObject、 数字、字符串或 JSONObject.NULL 对象。 [Source]

在您的情况下,元素将是 JSONObject 类型,因此您需要转换为 JSONObject 并调用 JSONObject.names() 来检索各个键。

【讨论】:

  • 我知道这些值是字符串类型的。如何确定数组中第一个元素的值和最后一个元素的值?
【解决方案5】:

要使用@aianitro 对io.vertx.core.json.JsonArray where the iterator returns Object 等情况的有效解决方案,然后将对象强制转换为 JsonObject...

Iterator<Object> it = timeseries.iterator();
while(it.hasNext()){
    JsonObject jobj = (JsonObject) it.next();
    System.out.println(jobj);
}

【讨论】:

    【解决方案6】:

    您可以尝试我的(*大量从各个站点借来的)递归方法来遍历所有 JSON 对象和 JSON 数组,直到找到 JSON 元素。此示例实际上搜索特定键并返回该键的所有实例的所有值。 'searchKey' 是您要查找的键。

    ArrayList<String> myList = new ArrayList<String>();
    myList = findMyKeyValue(yourJsonPayload,null,"A"); //if you only wanted to search for A's values
    
        private ArrayList<String> findMyKeyValue(JsonElement element, String key, String searchKey) {
    
        //OBJECT
        if(element.isJsonObject()) {
            JsonObject jsonObject = element.getAsJsonObject();
    
            //loop through all elements in object
    
            for (Map.Entry<String,JsonElement> entry : jsonObject.entrySet()) {
                JsonElement array = entry.getValue();
                findMyKeyValue(array, entry.getKey(), searchKey);
    
            }
    
        //ARRAY
        } else if(element.isJsonArray()) {
            //when an array is found keep 'key' as that is the array's name i.e. pass it down
    
            JsonArray jsonArray = element.getAsJsonArray();
    
            //loop through all elements in array
            for (JsonElement childElement : jsonArray) {
                findMyKeyValue(childElement, key, searchKey);
            }
    
        //NEITHER
        } else {
    
            //System.out.println("SKey: " + searchKey + " Key: " + key );
    
                if (key.equals(searchKey)){
                    listOfValues.add(element.getAsString());
                }
        }
        return listOfValues;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-07-11
      • 1970-01-01
      • 1970-01-01
      • 2019-10-20
      • 2020-08-23
      • 2017-10-28
      • 2011-06-14
      • 2019-07-30
      • 2011-05-27
      相关资源
      最近更新 更多