【问题标题】:JSONObject - How to get a value?JSONObject - 如何获取值?
【发布时间】:2011-11-19 01:52:48
【问题描述】:

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

以下是我的代码sn-p:

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

我如何获得'slogan'的价值?

我尝试了页面上列出的所有方法,但都没有奏效。

【问题讨论】:

  • 仅供参考,像 Jackson 这样的东西比使用 json 参考实现更快、更容易。
  • @Jon7 // 谢谢你的建议。我会试试杰克逊。我是 Java 新手..谢谢 :)
  • 那是什么图书馆? json-simple?

标签: java json


【解决方案1】:
String loudScreaming = json.getJSONObject("LabelData").getString("slogan");

【讨论】:

  • 我们如何使用 GSON 做到这一点?
  • @PrithviBoinpally,您可以执行以下操作:String temp = json.get("labelData").getAsString();
  • 这里的“json”变量类型是什么?
  • @vikramvi 那是指问题,其中jsonJSONObject
【解决方案2】:

如果您追求的是更深层次的键/值,并且您不处理每个级别的键/值数组,则可以递归搜索树:

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)即使在递归调用返回合法值之后,while 循环仍在继续。 (2)您无法区分,未找到密钥与密钥具有合法值“”。也就是说,您正在 JSONObject 上调用 keys() 方法,这表明这里的 JSONObject 只不过是 Map。此外,您无论如何都在 JSONObject 中迭代 keys() 那么为什么要显式地将其转换为 Map 呢?
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    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. “键”:{对象}
    3. “键”:[数组]

    逻辑:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-30
    • 2013-02-19
    • 1970-01-01
    • 2017-10-02
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多