Remove all elements except one from JSONArray of JSONObjects

后端 未结 3 732
离开以前
离开以前 2021-01-27 00:56

I have a JSONArray (org.json) like this:

[
    { \"a\": \"a\" },
    { \"b\": \"a\" },
    { \"c\": \"a\" },
    { \"d\": \"a\" },
    { \"e\": \"a\" },
    { \"         


        
相关标签:
3条回答
  • 2021-01-27 00:56

    If you want to avoid using type casts, try:

    private static final String JSON = "{\"arr\": [" +
            "{\"z\": \"z\"}," +
            "{\"a\": \"a\"}," +
            "{\"b\": \"b\"}," +
            "{\"c\": \"c\"}" +
            "]}";
    . . .
    JSONObject jsonObject = new JSONObject(JSON);
    JSONArray array = jsonObject.getJSONArray("arr");
    JSONArray filtered = new JSONArray();
    
    for (int i = 0; i < array.length(); i++) {
        JSONObject sub = array.getJSONObject(i);
        if (sub.has("a")) {
             filtered.put(sub);
         }
    }
    
    jsonObject.put("arr", filtered);
    System.out.println(jsonObject.toString());
    

    Result:

    {"arr":[{"a":"a"}]}
    
    0 讨论(0)
  • 2021-01-27 01:01

    If you're seeking a functional style solution, you can wrap the Iterator into a Stream and then do whatever you want.

    One of the functional solutions:

    JSONArray newJsonArray =
            StreamSupport.stream(jsonArray.spliterator(), false)
                         .filter(JSONObject.class::isInstance)
                         .map(JSONObject.class::cast)
                         .filter(j -> j.has("a"))
                         .collect(collectingAndThen(toList(), JSONArray::new));
    

    Note: The solution above does not modify the original JSONArray. Following the principles of functional programming one should prefer collecting into a new object rather than modifying the existing one.

    0 讨论(0)
  • 2021-01-27 01:15

    What we can do is map all JSONObjects to a List if they contain the key a. Then we can create a new JSONArray from that List of objects, which in this case is only 1.

    You can technically do this in a single line but it looks a bit worse IMO.

    List<JSONObject> objects = IntStream.range(0, array.length())
            .filter(index -> array.get(index) instanceof JSONObject)
            .mapToObj(array::getJSONObject)
            .filter(object -> object.has("a"))
            .collect(Collectors.toList());
    
    JSONArray reduced = new JSONArray(objects);
    
    0 讨论(0)
提交回复
热议问题