【问题标题】:Find value for a key from a dynamic json using java使用java从动态json中查找键的值
【发布时间】:2015-09-18 09:38:11
【问题描述】:

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

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

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

如果字符串键 = "功能";
然后
JsonElement Jvalue = jsonGetValueformKey(Jmsg,key);
应该以 JsonElement 或 jsonArray 类型返回 [9004,9005]。

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

【问题讨论】:

  • 我假设您当前使用Gson,所以我建议您查看entrySet() 方法,该方法返回您元素的所有成员。从那里您可以使用循环或递归遍历所有字段。但要小心,例如String key = "id"
  • 是的.. 我正在使用Gson 使用 Gson 实现会有所帮助
  • 您打算如何使用 JsonArray 中的键(如 "config123")或使用 "id" 等甚至出现在不同层上的键?
  • 是的.. json 可以是任何东西。 ...它甚至可能没有我们正在搜索的那个键
  • 那没有回答我的问题。当您搜索关键字 "config123""oauthSecret""id" 时,请提供您的样本的预期输出

标签: java json search


【解决方案1】:

你可以使用这样的东西:-

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

这将为您提供键的对象类型,如果键不存在,则为 null。 您可以修改它并将返回的Object 类型转换为任何JSONObjectStringJSONArray,具体取决于您的条件,方法是使用getClass() 检查其类。

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

【讨论】:

    【解决方案2】:

    请试试这个

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

    【讨论】:

    • 您确定使用此代码check(key,entry.getValue().toString().replace("[", "").replace("]", "")); 它会将9004,9005 作为json 发送
    • @ChinmaySamant 我认为它现在可以工作了,请检查我测试过所有案例的更新代码
    • 你确定这将在键多次出现的情况下工作..它应该返回值数组
    • 我觉得 return; 应该把它添加到列表中
    • 对于“config123”,它应该返回 [{“oauthSecret”:“P8n2x5Hsst0nFRRB0A”,“status”:“CREATED”},{“oauthSecret”:“P8n2x5Htss0nFRRB0A”}] 和“id”它应该返回 [1753_CORE1,45,46]
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:
      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;
      }
      

      【讨论】:

        【解决方案5】:

        我必须在 DrB awnser 中进行一些更改,它对我有用。因为在第一个嵌套的 json 上它没有检查值就返回了,所以如果 key 不在第一个中,那么它就找不到它。

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

        【讨论】:

          猜你喜欢
          • 2015-09-28
          • 2020-07-27
          • 2021-08-09
          • 2019-01-07
          • 1970-01-01
          • 2017-06-27
          • 1970-01-01
          • 1970-01-01
          • 2020-03-14
          相关资源
          最近更新 更多