使用java从动态json中查找键的值

时间:2015-07-01 09:40:13

标签: java json search

我需要从动态json中获取键的值 输入 - > json对象,字符串键
输出 - > json元素(对应于键的值)
示例

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
  ]
}

和String key =“status”;
然后 JsonElement Jvalue = jsonGetValueformKey(Jmsg,key);
应该在JsonElement或字符串类型中返回'CREATED'。

如果String key =“features”;
然后
JsonElement Jvalue = jsonGetValueformKey(Jmsg,key);
应该在JsonElement或jsonArray类型中返回[9004,9005]。

如果找不到密钥则返回null
JsonObject Jmsg可以是任何东西

4 个答案:

答案 0 :(得分:9)

请试试这个

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

}

答案 1 :(得分:5)

这是一个递归方法的草案。

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

答案 2 :(得分:0)

您可以使用以下内容: -

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

如果键不存在,这将为您提供键的Object类型OR null。 你可以修改它&amp;根据您的情况,通过使用Object检查其类别,将返回JSONObject类型转换为任何StringJSONArraygetClass()

注意: - 这只是一个参考,但您可以根据需要进行编辑。

答案 3 :(得分:0)

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