2015-07-01 3 views
3

Мне нужно получить значение ключа из динамического json.
Вход-> Объект JSON, строка ключа
output-> JSON элемент (соответствует значению ключа)
ПримерНайти значение для ключа из динамического json с помощью java

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

и Строка ключа = "Статус" ;
then JsonElement Jvalue = jsonGetValueformKey (Jmsg, key);
должен возвращать 'CREATED' в JsonElement или тип строки.

if String key = "features";
затем
JsonElement Jvalue = jsonGetValueformKey (Jmsg, key);
должен возвращать [9004,9005] в JsonElement или jsonArray.

если ключ не найден, то вернуть нулевой
JSONObject Jmsg может быть что-нибудь

+0

Я предполагаю, что вы в настоящее время используете 'Gson', поэтому я рекомендую взглянуть на метод' entrySet() ', который возвращает всех членов вашего элемента. Оттуда вы можете работать с циклами или рекурсивно через все поля. Но будьте осторожны с, например, 'String key =" id "' – ceekay

+0

Да .. Я использую 'Gson' реализация с использованием Gson будет полезна –

+0

И как вы планируете работать с ключами внутри' JsonArray' like '" config123 "или с такими ключами, как '' id "', которые даже появляются на разных уровнях? – ceekay

ответ

5

пожалуйста, попробуйте этот

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

} 
+0

вы уверены, что с этим кодом 'проверки (ключ, entry.getValue() ToString(). замените ("[", "").replace ("]", "")); ' отправит' 9004,9005' как json –

+0

@ChinmaySamant Я думаю, что сейчас это работает, пожалуйста, проверьте обновленный код. Я проверил все случаи. –

+0

спасибо за помощь :) –

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

Это даст вам тип объекта для ключа или нулевое значение, если ключа не существует. Вы можете изменить его & caste the return Object type to any JSONObject, String или JSONArray в зависимости от вашего состояния, проверив его класс, используя getClass().

Примечание: - Это только ссылка, но вы можете отредактировать ее в соответствии с вашими потребностями.

1

Это проект рекурсивного подхода для этого.

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

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

     if (jObj.get(key) instanceof JSONObject) { 
      System.out.println(jObj.get(key)); 
      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); 
      } 
     } 
    } 
+0

выше код выглядит более перспективным –

Смежные вопросы