JSON数组问题

时间:2011-02-01 18:28:45

标签: java android json

HY!

我有一个带有电视频道的JSON数组,数组的长度为3,但在传输到树形图后,Value只有一个。

请帮助

代码:

try
            {

                JSONObject menuobj = this.getJSONObject("responseData");
                Log.e("XXX", menuobj.toString());
                JSONArray array = menuobj.getJSONArray("countries");
                TreeMap<String, Integer> map = new TreeMap<String, Integer>();
                for (int i = 0; i < array.length(); i++)
                {
                    JSONObject obj = new JSONObject();
                    obj = array.getJSONObject(i);
                    if (obj.getString("name").equals(country))
                    {
                        Log.e("XXX2", obj.toString());
                        JSONArray arr = obj.getJSONArray("channels");
                        Log.e("XXX3", String.valueOf(arr.length()));
                        for (int j = 0; j < arr.length(); j++)
                        {
                            JSONObject obj2 = new JSONObject();
                            obj2 = arr.getJSONObject(i);
                            map.put(obj2.getString("name"), obj2.getInt("id"));
                        }
                        Log.e("XXX4", String.valueOf(map.size()));
                        return map;
                    }


                }

logcat的:

02-01 18:24:20.277: ERROR/XXX(3784): {"countries":[{"id":"1","channels":[{"id":"3","name":"ARD"},{"id":"1","name":"ORF 1"},{"id":"2","name":"ORF 2"}],"name":"Ã?sterreich"},{"id":"2","channels":[{"id":"3","name":"ARD"}],"name":"Deutschland"}]}
02-01 18:24:20.288: ERROR/XXX2(3784): {"id":"1","channels":[{"id":"3","name":"ARD"},{"id":"1","name":"ORF 1"},{"id":"2","name":"ORF 2"}],"name":"Ã?sterreich"}
02-01 18:24:20.297: ERROR/XXX3(3784): 3
02-01 18:24:20.307: ERROR/XXX4(3784): 1

3 个答案:

答案 0 :(得分:2)

我相信:

obj2 = arr.getJSONObject(i);

应该是

obj2 = arr.getJSONObject(j);

所以你要将相同的键/值对象放三次到地图上。

答案 1 :(得分:0)

您需要使用JSONArray而不使用JSONObject

 JSONArray resultJson = new JSONArray(responseDataString);

答案 2 :(得分:0)

您错过了重要的日志记录详细信息,请将其命名为XXX3.5。几乎可以肯定的是,地图包含一个元素,因为每次调用map.put()都会传入一个被认为等于地图中已经存在的键的键。

现在我希望这些键是通道的字符串名称,这些名称是截然不同的,所以很明显,这种期望并不成立。添加obj2.getString("name")的日志消息(或者在那里设置断点)将让您看到映射键实际是什么,以及后续调用覆盖现有映射的原因。输出对象的实际类也很有用,以便区分实际的String和仅包含String的某个类。

如果元素看起来合理,问题可能是对所讨论的类的equals()的松散定义,这等同于应该看起来不同的元素。无论如何,更好的日志记录将显示原因

arr.getJSONObject(0).getString("name").equals(arr.getJSONObject(1).getString("name")
当你希望它返回false时,

返回true。