JSONObject - Как получить значение?
Я использую Java-класс на http://json.org/javadoc/org/json/JSONObject.html.
Ниже приведен мой фрагмент кода.
String jsonResult = UtilMethods.getJSON(this.jsonURL, null);
json = new JSONObject(jsonResult);
getJSON возвращает следующую строку
{"LabelData":{"slogan":"AWAKEN YOUR SENSES","jobsearch":"JOB SEARCH","contact":"CONTACT","video":"ENCHANTING BEACHSCAPES","createprofile":"CREATE PROFILE"}}
Теперь... как мне получить значение "лозунг"?
Я перепробовал все методы, перечисленные на странице, но ни один из них не сработал.
3 ответа
String loudScreaming = json.getJSONObject("LabelData").getString("slogan");
Если вам нужен более глубокий ключ / значение, и вы не имеете дело с массивами ключей / значений на каждом уровне, вы можете рекурсивно искать дерево:
public static String recurseKeys(JSONObject jObj, String findKey) throws JSONException {
String finalValue = "";
if (jObj == null) {
return "";
}
Iterator<String> keyItr = jObj.keys();
Map<String, String> map = new HashMap<>();
while(keyItr.hasNext()) {
String key = keyItr.next();
map.put(key, jObj.getString(key));
}
for (Map.Entry<String, String> e : (map).entrySet()) {
String key = e.getKey();
if (key.equalsIgnoreCase(findKey)) {
return jObj.getString(key);
}
// read value
Object value = jObj.get(key);
if (value instanceof JSONObject) {
finalValue = recurseKeys((JSONObject)value, findKey);
}
}
// key is not found
return finalValue;
}
Использование:
JSONObject jObj = new JSONObject(jsonString);
String extract = recurseKeys(jObj, "extract");
Используя код карты от /questions/35754782/konvertirovat-json-v-kartu/35754797#35754797
Это может быть полезно при поиске ключей, присутствующих во вложенных объектах и вложенных массивах. И это универсальное решение для всех случаев.
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class MyClass
{
public static Object finalresult = null;
public static void main(String args[]) throws JSONException
{
System.out.println(myfunction(myjsonstring,key));
}
public static Object myfunction(JSONObject x,String y) throws JSONException
{
JSONArray keys = x.names();
for(int i=0;i<keys.length();i++)
{
if(finalresult!=null)
{
return finalresult; //To kill the recursion
}
String current_key = keys.get(i).toString();
if(current_key.equals(y))
{
finalresult=x.get(current_key);
return finalresult;
}
if(x.get(current_key).getClass().getName().equals("org.json.JSONObject"))
{
myfunction((JSONObject) x.get(current_key),y);
}
else if(x.get(current_key).getClass().getName().equals("org.json.JSONArray"))
{
for(int j=0;j<((JSONArray) x.get(current_key)).length();j++)
{
if(((JSONArray) x.get(current_key)).get(j).getClass().getName().equals("org.json.JSONObject"))
{
myfunction((JSONObject)((JSONArray) x.get(current_key)).get(j),y);
}
}
}
}
return null;
}
}
Возможности:
- "ключ":"значение"
- "ключ":{Объект}
- "ключ":[массив]
Логика:
- Я проверяю, совпадают ли текущий ключ и ключ поиска, если да, то возвращаю значение этого ключа.
- Если это объект, я рекурсивно отправляю значение той же функции.
- Если это массив, я проверяю, содержит ли он объект, в таком случае я рекурсивно передаю значение той же функции.
Вы можете попробовать приведенную ниже функцию, чтобы получить значение из строки JSON,
public static String GetJSONValue(String JSONString, String Field)
{
return JSONString.substring(JSONString.indexOf(Field), JSONString.indexOf("\n", JSONString.indexOf(Field))).replace(Field+"\": \"", "").replace("\"", "").replace(",","");
}