Chinmay Samant
Chinmay Samant

Reputation: 282

Find value for a key from a dynamic json using java

I need to get the value of the key from a dynamic json.
Input-> json Object, String key
Output-> json element(corresponds to the value of the key)
Example

JsonObject Jmsg =

{
  "id": "1753_CORE1",
  "name": "Gtx cuda Service:1753",
  "shortName": "gt-service-1753",
  "createdDate": "Mar 31, 2015 4:47:10 PM",
  "config": {
    "oauthSecret": [
      {
        "id": 45,
        "config123": {
          "oauthSecret": "P8n2x5Hsst0nFRRB0A",
          "status": "CREATED"
        },
        "SERVER132": "1000"
      },
      {
        "id": 46,
        "config123": {
          "oauthSecret": "P8n2x5Htss0nFRRB0A"
        },
        "SERVER132": "1000"
      }
    ],
    "oauthKey": "154284-service-1753",
    "SERVER": "1000"
  },
  "features": [
    9004,
    9005
  ]
}

and String key = "status";
then JsonElement Jvalue = jsonGetValueformKey(Jmsg,key);
should return 'CREATED' in JsonElement or string type.

if String key = "features";
then
JsonElement Jvalue = jsonGetValueformKey(Jmsg,key);
should return [9004,9005] in JsonElement or jsonArray type.

if key not found then return null
JsonObject Jmsg can be anything

Upvotes: 5

Views: 22223

Answers (5)

Gianlucca Buzo
Gianlucca Buzo

Reputation: 1

I had to make some changes in DrB awnser, it worked for me this way. Because on the first nested json it returned without checking the value, so if the key wasn't in the first one, then it couldn't find it.

public Object find(JSONObject jObj, String k) throws JSONException {
    Iterator<?> keys = jObj.keys();

    while (keys.hasNext()) {
        String key = (String) keys.next();
        if (key.equals(k)) {
            return jObj.get(key);
        }

        if (jObj.get(key) instanceof JSONObject) {
            Object probableKeyValue = find((JSONObject) jObj.get(key), k);
            if(probableKeyValue != null){
                return probableKeyValue;
            }
        }

        if (jObj.get(key) instanceof JSONArray) {
            JSONArray jar = (JSONArray) jObj.get(key);
            for (int i = 0; i < jar.length(); i++) {
                JSONObject j = jar.getJSONObject(i);
                find(j, k);
            }
        }
    }
    return null;
}

Upvotes: 0

Taha Saber
Taha Saber

Reputation: 51

private Object findJsonParam(JSONObject payload, String param) {
    Iterator<?> keys = payload.keys();

    System.out.println("payload  " + payload);

    while (keys.hasNext()) {

        String key = (String) keys.next();
        if (key.equals(param)) {
            return payload.get(key);
        } else if (payload.get(key) instanceof JSONObject) {

            Object val = findJsonParam(payload.getJSONObject(key), param);
            if (val != null)
                return val;
        } else if (payload.get(key) instanceof JSONArray) {
            JSONArray jar = payload.getJSONArray(key);
            for (Object jsonObj : jar) {
                Object val = findJsonParam((JSONObject) jsonObj, param);
                if (val != null)
                    return val;
            }
        }
    }

    return null;
}

Upvotes: 0

DrB
DrB

Reputation: 264

This is a draft of a recursive approach for that.

Object find(JSONObject jObj, String k) throws JSONException {
    Iterator<?> keys = jObj.keys();

    while( keys.hasNext() ) {
        String key = (String)keys.next();
        if (key.equals(k)) {
            return jObj.get(key);
        }

        if ( jObj.get(key) instanceof JSONObject ) {
            return find((JSONObject)jObj.get(key), k);
        }

        if ( jObj.get(key) instanceof JSONArray ) {
            JSONArray jar = (JSONArray)jObj.get(key);
            for (int i = 0; i < jar.length(); i++) {
                JSONObject j = jar.getJSONObject(i);
                find(j, k);
            }
        }
    }

Upvotes: 5

Safwan Hijazi
Safwan Hijazi

Reputation: 2089

please try this

package json;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.google.gson.JsonElement;
import com.google.gson.JsonParser;

public class MyApp {
    static List<String> list = new ArrayList<String>();
    public static void main(String[] args) {

        String key = "oauthSecret";

        String json2 = "{\"config\": {\"oauthSecret\": [{\"id\": 45,\"config123\": {\"oauthSecret\": \"P8n2x5Ht0nFRRB0A\",\"status\": \"CREATED\"},\"SERVER132\": \"1000\"},{\"id\": 46,\"config123\": {\"oauthSecret\": \"wP8n2x5Ht0nFRRB0A\",\"status\": \"CREATED\"},\"SERVER132\": \"1000\"}],\"oauthKey\": \"newtest\",\"SERVER\": \"1000\"},\"features\": [ 9004, 9005] ,\"d\":\"dd\"}";

        System.out.println("JSON: " + json2);
        JsonParser p = new JsonParser();
        check(key, p.parse(json2));
        System.out.println("list size: " + list.size());
        System.out.println(list);
    }



    private static void check(String key, JsonElement jsonElement) {

        if (jsonElement.isJsonArray()) {
            for (JsonElement jsonElement1 : jsonElement.getAsJsonArray()) {
                check(key, jsonElement1);
            }
        } else {
            if (jsonElement.isJsonObject()) {
                Set<Map.Entry<String, JsonElement>> entrySet = jsonElement
                        .getAsJsonObject().entrySet();
                for (Map.Entry<String, JsonElement> entry : entrySet) {
                    String key1 = entry.getKey();
                    if (key1.equals(key)) {
                        list.add(entry.getValue().toString());
                    }
                    check(key, entry.getValue());
                }
            } else {
                if (jsonElement.toString().equals(key)) {
                    list.add(jsonElement.toString());
                }
            }
        }
    }

}

Upvotes: 11

AnkeyNigam
AnkeyNigam

Reputation: 2820

You could use something like this :-

public Object checkKey(JSONObject object, String searchedKey) {
    boolean exists = object.containsKey(searchedKey);
    Object obj = null;
    if(exists){
        obj = object.get(searchedKey);
    }
    if(!exists) {      
         Set<String> keys = object.keySet();
         for(String key : keys){
             if ( object.get(key) instanceof JSONObject ) {
                 obj = checkKey((JSONObject)object.get(key), searchedKey);
            }
         }
    }
    return obj;
}

This will give you the Object type for a key OR null if key does not exists. You can modify it & caste the return Object type to any JSONObject, String or JSONArray depending upon your condition by checking its class using getClass().

Note :- This is just a reference but you can edit it according to your needs.

Upvotes: 0

Related Questions