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

问题描述 投票:0回答:2

我有一个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"));
        }
    }
    }
}

输出是

史蒂夫

java json
2个回答
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")));

由于“empid”似乎不是唯一的,您可能希望获得结果列表:

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());

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上找到它。

© www.soinside.com 2019 - 2024. All rights reserved.