我有一个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.size(); 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.
}
是否可以做这样的事情?
我想这样做的原因是因为文件中的数组具有不同数量的元素。
答案 0 :(得分:71)
更改
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);
“获取第一个元素的值和最后一个元素的值。”
如果“element”指的是数组中的组件,请注意第一个组件位于索引0,最后一个组件位于索引getArray.length() - 1
。
我想迭代数组中的对象并获得它们的组件和它们的值。在我的例子中,第一个对象有3个组件,scond有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
*/
答案 1 :(得分:13)
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("-----------");
}
希望这有助于某人
答案 2 :(得分:6)
for(int i = 0; i < getArray.size(); i++){
Object object = getArray.get(i);
// now do something with the Object
}
您需要检查类型:
值可以是以下任何类型:Boolean,JSONArray,JSONObject, Number,String或JSONObject.NULL对象。 [Source]
在您的情况下,元素将是JSONObject类型,因此您需要强制转换为JSONObject并调用JSONObject.names()
来检索单个键。
答案 3 :(得分:4)
JsonArray jsonArray;
Iterator<JsonElement> it = jsonArray.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
答案 4 :(得分:0)
您可以尝试我的(*从各种站点大量借用)递归方法来遍历所有JSON对象和JSON数组,直到找到JSON元素。此示例实际上搜索特定键并返回该键的所有实例的所有值。 &#39; searchKey&#39;是你正在寻找的关键。
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;
}