【问题标题】:JSON Array ProblemJSON数组问题
【发布时间】:2011-02-01 18:28:44
【问题描述】:

喂!

我有一个带有电视频道的 JSON 数组,数组的长度是三,但是在传输到树形图中后,值只有一。

请帮忙

代码:

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

【问题讨论】:

    标签: java android json


    【解决方案1】:

    我相信:

    obj2 = arr.getJSONObject(i);
    

    应该是

    obj2 = arr.getJSONObject(j);
    

    因此,您将三倍于同一对象的键/值对放入映射中。

    【讨论】:

      【解决方案2】:

      你需要使用JSONArray而不使用JSONObject

       JSONArray resultJson = new JSONArray(responseDataString);
      

      【讨论】:

        【解决方案3】:

        您遗漏了一个重要的日志记录细节,称之为XXX3.5。几乎可以肯定,地图包含一个元素,因为每次调用 map.put() 都会传入一个密钥,该密钥被认为等于地图中已有的密钥。

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

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

        arr.getJSONObject(0).getString("name").equals(arr.getJSONObject(1).getString("name")
        

        当你期望它返回 false 时返回 true。

        【讨论】:

        • ^^ 三次 ARD 02-01 18:38:46.627: ERROR/XXX3.5(4148): ARD 02-01 18:38:46.627: ERROR/XXX3.5(4148): ARD 02-01 18:38:46.627: 错误/XXX3.5(4148): ARD
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多