Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从JSON解析嵌套值并添加到HashMap中_Java_Android_Json - Fatal编程技术网

Java 从JSON解析嵌套值并添加到HashMap中

Java 从JSON解析嵌套值并添加到HashMap中,java,android,json,Java,Android,Json,我正在使用来自Yummly API的数据来获取配方详细信息。我正在创建一个Android应用程序,它将根据用户输入的匹配成分显示食谱。我试图找到“recipeName”标签,但它抱怨它没有任何价值,我尝试了各种方法。我试图将所有配方名称添加到HashMap中,稍后将在ListView中显示 下面是一个以JSON对象形式出现的配方示例(共39个) { “归属”:{ “html”:“搜索引擎由”, “url”:”http://www.yummly.com/recipes/soup", “文本”:“

我正在使用来自Yummly API的数据来获取配方详细信息。我正在创建一个Android应用程序,它将根据用户输入的匹配成分显示食谱。我试图找到“recipeName”标签,但它抱怨它没有任何价值,我尝试了各种方法。我试图将所有配方名称添加到HashMap中,稍后将在ListView中显示

下面是一个以JSON对象形式出现的配方示例(共39个)

{
“归属”:{
“html”:“搜索引擎由”,
“url”:”http://www.yummly.com/recipes/soup",
“文本”:“汤食谱:由Yummly支持的搜索”,
“徽标”:”
},
“totalMatchCount”:39,
“FaceCounts”:{},
“匹配项”:[
{
“属性”:{
“课程”:[
“汤”
],
“烹饪”:[
“意大利语”
]
},
“口味”:{
“咸”:0.666666,
“酸”:0.8333334,
“甜”:0.666666,
“苦”:0.5,
“肉质”:0.16666,
“辣味”:0.5
},
“评级”:4.6,
“id”:“素食卷心菜汤Recipezaar”,
“SmallImageURL”:[],
“sourceDisplayName”:“Food.com”,
“totalTimeInSeconds”:4500,
“成分”:[
“大蒜丁香”,
“胡椒粉”,
“西红柿丁”,
“芹菜”,
“番茄汁”,
“盐”,
“卷心菜”,
“甜椒”,
“牛至”,
“胡萝卜”,
“罗勒”,
“蔬菜肉汤”,
“辣椒片”,
“青豆”,
“洋葱”,
“洋葱汤混合物”
],
“recipeName”:“素菜白菜汤”
}
}
我的搜索类片段

//imports above  

    private static final String TAG_TOTAL_MATCH = "totalMatchCount";
    private static final String TAG_MATCHES = "matches";
    private static final String TAG_NAME = "recipeName";
    private static final String TAG_RATING = "rating";

        JSONParser jsonParser = new JSONParser();

        protected String doInBackground(String... args) {    
            JSONObject json = jsonParser.makeHttpRequest(full_url, "GET", params);

            // check log cat for JSON response
            Log.d("Response", json.toString());

            // check for success tag
            try {
                int count = json.getInt(TAG_TOTAL_MATCH);
                String name = json.getString(TAG_NAME);
                String matches = json.getString(TAG_MATCHES);
                JSONObject namelist = json.getJSONObject(matches).getJSONObject(name);

                HashMap<String, String> pairs = new HashMap<String, String>();

                if (count > 0) {
                    int i;

                    //populate Hashmap with recipe names
                    for (i=1; i<=count; i++){
                        Iterator it = namelist.keys();
                        while (it.hasNext()) {
                            String n = (String) it.next();
                            pairs.put(n,name);
                        }
                    }
                    //display Hashmap in terminal
                    for(int j =0; j<pairs.size(); j++) {
                        System.out.println(pairs.get(j));

                }

            }
        }
    }
//上面的导入
私有静态最终字符串标记\u TOTAL\u MATCH=“totalMatchCount”;
私有静态最终字符串标记_MATCHES=“MATCHES”;
私有静态最终字符串标记_NAME=“recipeName”;
私有静态最终字符串标记_RATING=“RATING”;
JSONParser JSONParser=新的JSONParser();
受保护的字符串doInBackground(字符串…args){
JSONObject json=jsonParser.makeHttpRequest(完整url,“GET”,参数);
//检查日志cat中的JSON响应
Log.d(“Response”,json.toString());
//检查成功标签
试一试{
int count=json.getInt(TAG\u TOTAL\u MATCH);
String name=json.getString(TAG_name);
String matches=json.getString(标记匹配);
JSONObject namelist=json.getJSONObject(匹配项).getJSONObject(名称);
HashMap pairs=新的HashMap();
如果(计数>0){
int i;
//用配方名称填充Hashmap

对于(i=1;i
recipeName
rating
匹配项中,但您试图访问它们,就好像它们与
totalMatchCount
处于同一级别一样

作为一个开始,考虑删除这一行:

String matches = json.getString(TAG_MATCHES);
并更改下一行以从根对象获取匹配数组:

JSONArray matches = json.getJSONArray(TAG_MATCHES);

我相信您可以通过迭代matches数组并独立处理每个配方来实现这一点。

成功了!我使用了JSONArray,去掉了while循环,改为JSONObject js=matches.getJSONObject(I);String name=js.getString(TAG_name);pairs.put(i+1,姓名);很高兴你把它解决了!如果你也能接受正确的答案(除了投票),我将不胜感激。
JSONArray matches = json.getJSONArray(TAG_MATCHES);