JSONObject-如何获取值?


69

我在http://json.org/javadoc/org/json/JSONObject.html上使用Java类。

以下是我的代码段:

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

我如何获得“口号”的价值?

我尝试了页面上列出的所有方法,但没有一个起作用。


仅供参考,像Jackson之类的东西比使用json参考实现更快速,更容易。
2011年

@ Jon7 //谢谢您的建议。我将尝试杰克逊。我是Java的新手。。谢谢:)
月亮

那是什么图书馆?json简单吗?
Volodymyr Balytskyy,2015年

Answers:



9

如果这是您需要的更深的键/值,并且您没有处理每个级别的键/值数组,则可以递归搜索树:

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

使用来自https://stackoverflow.com/a/4149555/2301224的地图代码


1
实现存在一个或多个错误:(1)即使在递归调用返回合法值之后,while循环仍在继续。(2)您无法区分,未找到键与键具有合法值“”。就是说,您正在JSONObject上调用keys()方法,这表明在这里JSONObject就是Map。此外,无论如何,您都是在JSONObject中迭代keys(),然后为什么将其显式转换为Map?
sactiw

0

您可以尝试使用以下函数从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(",","");   
}

0

在搜索嵌套对象嵌套数组中存在的键时,这可能会有所帮助。这是对所有情况的通用解决方案。

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

可能性:

  1. “核心价值”
  2. “键”:{Object}
  3. “键”:[数组]

逻辑:

  • 我检查当前关键字和搜索关键字是否相同,如果是,则返回该关键字的值。
  • 如果它是一个对象,则将值递归发送到同一函数。
  • 如果是数组,则检查它是否包含对象,如果是,则将值递归传递给同一函数。

你能回答这个问题吗?stackoverflow.com/questions/60329223/…–
Siva
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.