简体   繁体   English

Java从JsonArray获取一个JSONObject

[英]Java get one JSONObject from a JsonArray

I have a Json array, i want to get only one Json object from it. 我有一个Json数组,我想从它只获得一个Json对象。 In this example how can i get the object with Apple 在这个例子中,我如何通过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"
}
]

Previously i used to get it via it's index position but since json doesn't guarantee me order/arrangement that's why i need to specifically get one object without using the index method. 以前我曾经通过它的索引位置得到它,但由于json不保证我的顺序/排列,这就是为什么我需要专门获取一个对象而不使用索引方法。

You can use a loop to iterate over every item in the JSONArray and find which JSONObject has the key you want. 您可以使用循环迭代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
    }

You could also return the JSONObject instead of the index. 您还可以返回JSONObject而不是索引。 Just change the return type in the method signature as well: 只需更改方法签名中的返回类型:

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
    }

Because you can't rely on indecies you'll have to use another identifier. 因为你不能依赖于indecies,你将不得不使用另一个标识符。 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: 该示例使用GSON,但它应该很容易适应:

/**
 * 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;
}

You can use the jackson library with ObjectMapper 您可以将Jackson库与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;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM