Json解析错误可以转换为JSONObject

时间:2017-10-27 12:59:40

标签: android json

您好我正在尝试从网址获取JSON到ListItem,我想在其中显示它。 但我得到的错误如下:

  

json parsing error:值为48600123456,类型为java.lang.String   无法转换为JSONObject。

部分代码:

@Override
        protected Void doInBackground(Void... arg0) {
            HttpHandler sh = new HttpHandler();

            // Making a request to url and getting response
            String jsonStr = sh.makeServiceCall(url);

            Log.e(TAG, "Response from url: " + jsonStr);

            if (jsonStr != null) {
                try {
                    JSONObject jsonObj = new JSONObject(jsonStr);

                    // Getting JSON Array node
                    JSONArray contacts = jsonObj.getJSONArray("phones");

                    // looping through All Contacts
                    for (int i = 0; i < contacts.length(); i++) {
                        JSONObject c = contacts.getJSONObject(i);

                       String name= c.getString("name");
                       String phone = c.getString("phone");
                       String phone2 = c.getString("phone2");

                        // tmp hash map for single contact
                        HashMap<String, String> contact = new HashMap<>();

                        // adding each child node to HashMap key => value
                        contact.put("name", name);
                        contact.put("phone", phone);
                        contact.put("pone2", phone2);

                        //adding contact to contact list
                        contactList.add(contact);
                    }

还有我的JSON。

  

{“phone”:[“phone:48600123456”,“phone2:48600234532”,“phone3:48600567234”]}

有什么问题?

4 个答案:

答案 0 :(得分:2)

该方法在

的第一次迭代时失败
JSONObject c = contacts.getJSONObject(i);

因为,根据输入中给出的json,变量contactsString的数组(&#34; 48600123456&#34;,&#34; 48600234532&#34;,&# 34; 48600567234&#34;),而不是JSONObject

这是解析给定json的方法:

...

// Getting JSON Array node
JSONArray contacts = jsonObj.getJSONArray("phones");

// looping through All Contacts
for (int i = 0; i < contacts.length(); i++) {
    String value = contacts.getString(i);

    ...
}

答案 1 :(得分:0)

您需要使用正确的类型索引数组。每个值都是一个字符串,因此请使用getString。否则,您只需使用get,然后再转换对象。

老实说,我认为你应该只使用手机列表,而不是地图,但这是你正在尝试的正确代码

// Getting JSON Array node
JSONArray phones = jsonObj.getJSONArray("phones");

// tmp hash map for single contact 
Map<String, String> phoneMap = new HashMap<>();

// adding each phone to HashMap key => value 
for (int i =0; i < phones.getLength(); i++) {
    phoneMap.put("phone"+i, phones.getString(i));
} 

//adding phones to contact list
contactList.add(phoneMap);

实际定义Contact对象可能是值得的。然后你可以尝试使用Gson,例如,为你解析JSON

修改

"name: value"仍然是一个字符串。如果您需要一组JSON对象,则外部必须有{},密钥需要[{"phone": "48600123456", "phone2": "48600234532"}]

如果你格式化,你可以清楚地看到差异。

{
    "phones": ["phone: 48600123456", "phone2: 48600234532", "phone3: 48600567234"]
}

vs

{
    "phones": [{
        "phone": "48600123456",
        "phone2": "48600234532",
        "phone3": "48600567234"
    }]
}

vs

{
    "phones": [{
            "phone": "48600123456"
        },
        {
            "phone": "48600234532"
        },
        {
            "phone": "48600567234"
        }
    ]
}

就个人而言,我认为您发布的第一种方式没有任何问题,这就是上面的代码所假设的

{
    "phones": ["48600123456", "48600234532", "48600567234"]
}

答案 2 :(得分:-1)

在jsonarray中没有任何JsonObject ,您试图在此处解析代码

for (int i = 0; i < contacts.length(); i++) {
 JSONObject c = contacts.getJSONObject(i);

直接从您的数组中访问您的字符串

for (int i = 0; i < contacts.length(); i++) {
      String contact=contacts.getString(i);
    }

答案 3 :(得分:-1)

从您的代码中,我认为您的json结构如下:

  

{ “电话”:[                { “名”: “48600123456”,                 “手机”: “48600234532”,                  “PHONE2”: “48600567234”}]}