没有循环JSON数组如何从JSON数组获取适当的值

时间:2017-12-18 14:52:15

标签: java json

我有一个JSON如下。

[{
        "empid": "1",
        "name": "Mark"

    },
    {
        "empid": "2",
        "name": "Steve"

    },
    {
        "empid": "1",
        "name": "Luke "

    }
]

根据empid作为输入,我需要获得适当的名称

我试过这个工作。

但是没有循环是否有任何简单的方法?

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class JSONPArseEx {
    public static void main(String[] args) throws JSONException {
        String empIdInput = "2";

        String jsonStr = "[{\r\n" + 
                "       \"empid\": \"1\",\r\n" + 
                "       \"name\": \"Mark\"\r\n" + 
                "       \r\n" + 
                "   },\r\n" + 
                "   {\r\n" + 
                "       \"empid\": \"2\",\r\n" + 
                "       \"name\": \"Steve\"\r\n" + 
                "       \r\n" + 
                "   },\r\n" + 
                "   {\r\n" + 
                "       \"empid\": \"1\",\r\n" + 
                "       \"name\": \"Luke \"\r\n" + 
                "       \r\n" + 
                "   }\r\n" + 
                "]";

    JSONArray jsonarray = new JSONArray(jsonStr);
    for(int i=0;i<jsonarray.length();i++)
    {
        JSONObject json_obj = jsonarray.getJSONObject(i);
        if(json_obj.get("empid").equals(empIdInput))
        {
            System.out.println(json_obj.get("name"));
        }
    }
    }
}

输出

史蒂夫

2 个答案:

答案 0 :(得分:0)

更方便的处理可以使用流API(自Java 8起)。例如:

final Optional<JsonObject> result = empArray.stream()
        .map(empVal -> (JsonObject) empVal)
        .filter(emp -> empIdInput.equals(emp.getString("empid")))
        .findAny();

result.ifPresent(emp -> System.out.println(emp.get("name")));

要解决未经检查的演员,您可以添加一些过滤:

final Optional<JsonObject> result = empArray.stream()
        .filter(empVal -> empVal instanceof JsonObject)
        .map(empVal -> (JsonObject) empVal)
        .filter(emp -> empIdInput.equals(emp.getString("empid")))
        .findAny()
        .ifPresent(emp -> System.out.println(emp.get("name")));

as&#34; empid&#34;似乎不是唯一的,你可能想得到一个结果列表:

final List<JsonObject> result = empArray.stream()
        .filter(empVal -> empVal instanceof JsonObject)
        .map(empVal -> (JsonObject) empVal)
        .filter(emp -> empIdInput.equals(emp.getString("empid")))
        .collect(Collectors.toList());

答案 1 :(得分:0)

您必须遍历数组进行检查,但如果您不想使用循环 - 您可以使用Java 8 Streams:

import java.util.List;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;

public class JSONStreamExample {

     private static final String empIdInput = "2";

     private static final String jsonStr = "[{\r\n" + 
         "       \"empid\": \"1\",\r\n" + 
         "       \"name\": \"Mark\"\r\n" + 
         "       \r\n" + 
         "   },\r\n" + 
         "   {\r\n" + 
         "       \"empid\": \"2\",\r\n" + 
         "       \"name\": \"Steve\"\r\n" + 
         "       \r\n" + 
         "   },\r\n" + 
         "   {\r\n" + 
         "       \"empid\": \"1\",\r\n" + 
         "       \"name\": \"Luke \"\r\n" + 
         "       \r\n" + 
         "   }\r\n" + 
         "]";

/**
 * @param args
 */
public static void main(final String[] args) {

        @SuppressWarnings("unchecked")
        List<JSONObject> jsonArray = (JSONArray) JSONValue.parse(jsonStr);
        JSONObject result = jsonArray.stream()
                                .filter(obj -> obj.get("empid").equals(empIdInput))
                                .findFirst()
                                .orElse(null);
        if (result != null) {
            System.out.println(result.get("name"));
        }
    }

}

请注意,这使用了json-simple,您可以在maven存储库here上找到它。