Java从JsonArray获取一个JSONObject

时间:2016-02-12 19:11:50

标签: java json

我有一个Json数组,我想从它只获得一个Json对象。 在此示例中,如何使用Apple

获取对象
[
{
"name": "mango",
"use": "DA",
"date": "2011-09-26",
"seed": "31341"
},

{
"name": "apple",
"use": "DA",
"date": "2011-09-26",
"seed": "31341"
},

{
"name": "berry",
"use": "DA",
"date": "2011-09-26",
"seed": "31341"
}
]

以前我曾经通过它的索引位置得到它但是因为json不保证我的订单/安排,这就是为什么我需要在不使用索引方法的情况下专门获取一个对象。< / p>

3 个答案:

答案 0 :(得分:4)

您可以使用循环迭代JSONArray中的每个项目,并找到哪个JSONObject具有您想要的密钥。

private int getPosition(JSONArray jsonArray) throws JSONException {
        for(int index = 0; index < jsonArray.length(); index++) {
            JSONObject jsonObject = jsonArray.getJSONObject(index);
            if(jsonObject.getString("name").equals("apple")) {
                return index; //this is the index of the JSONObject you want
            } 
        }
        return -1; //it wasn't found at all
    }

您也可以返回JSONObject而不是索引。只需更改方法签名中的返回类型:

private JSONObject getPosition(JSONArray jsonArray) throws JSONException {
        for(int index = 0; index < jsonArray.length(); index++) {
            JSONObject jsonObject = jsonArray.getJSONObject(index);
            if(jsonObject.getString("name").equals("apple")) {
                return jsonObject; //this is the index of the JSONObject you want
            } 
        }
        return null; //it wasn't found at all
    }

答案 1 :(得分:0)

Because you can't rely on indecies you'll have to use another identifier. The best one would propably be the "name" field.

To find the one object with a specific name you'll have to iterate over the array and check every object, this is my code for doing that, it may not be the best or most efficient way but it works. The example uses GSON, but it should be easily adaptable:

/**
 * Function for getting an object with a specific name from an array.
 * 
 * @param arr The JsonArray to check in.
 * @param name The name to check for.
 * @return The JsonObject with a matching name field or null if none where found. 
 */
public static JsonObject getObjectWithName(JsonArray arr, String name)
{
    //Iterate over all elements in that array
    for(JsonElement elm : arr)
    {
        if(elm.isJsonObject()) //If the current element is an object.
        {
            JsonObject obj = elm.getAsJsonObject();

            if(obj.has("name")) //If the object has a field named "name"
            {
                JsonElement objElm = obj.get("name"); //The value of that field

                //Check if the value is a string and if it equals the given name
                if(objElm.isJsonPrimitive() && objElm.getAsJsonPrimitive().isString() && objElm.getAsString().equals(name))
                {
                    return obj;
                }
            }
        }
    }

    //Nothing matching was found so return null
    return null;
}

答案 2 :(得分:0)

You can use the jackson library with ObjectMapper

// Create a pojo for the json object
public class MyObject {
    public String name;
    public String use;
    public String date;
    public String seed;
}

...
public MyObject getApple(String jsonString) throws IOException {
    // the string type is MyObject array
    MyObject[] myObjects = new ObjectMapper().readValue(jsonString, MyObject[].class);
    for (MyObject myObject : myObjects ){
        if myObject.name.equals("apple") {
            return myObject;
        }
    }
    return null;
}