检索JSONArray中的元素时出现JSONException(来自json字符串)

时间:2016-09-19 12:33:18

标签: java arrays json

我有一个JSON字符串(jsonString):

["[{"Name":"name.pdf","ValueDate":"2016-08-30T22:00:00+0000"}]"] 

jsonString是一个数组,我必须从中检索Name元素 我使用下面的代码:

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

System.out.println("jsonString"+ jsonString);
JSONObject jsonObj = new JSONObject();

JSONArray lineItems = jsonObj.getJSONArray(jsonString);
for (Object o : lineItems) {
    JSONObject jsonLineItem = (JSONObject) o;
    String name = jsonLineItem.getString("Name");
    String valueDate = jsonLineItem.getString("ValueDate");
}

但我收到以下错误:

  

net.sf.json.JSONException:JSONObject [“[\”[{\“Name \”:\“name.pdf \”,\“ValueDate \”:\“2016-08-30T22:00:00 +0000 \“}] \”]“]不是JSONArray       at net.sf.json.JSONObject.getJSONArray(JSONObject.java:2038)~ [json-lib-2.4.jar:na]

有人可以帮助我吗?

更新: 我使用了JSONArray lineItems = JSONArray.fromObject(jsonString);超过qxz建议的错误并在代码下方使用循环JSONArray

JSONArray lineItems = JSONArray.fromObject(listDocToSendJson);  
for (int i = 0; i < lineItems.size(); i++) {
     JSONObject jsonObj = lineItems.getJSONObject(i);
     String name = jsonObj.getString("Name");
     String valueDate = jsonObj.getString("ValueDate");
}

for (Object object : lineItems) {
    JSONObject jsonStr = (JSONObject)JSONSerializer.toJSON(object);
    System.out.println(" name is --"+jsonStr.get("Name"));
    System.out.println(" value is ---"+jsonStr.get("ValueDate"));
}

两者都有错误

  1. net.sf.json.JSONException:JSONArray [0]不是JSONObject。

  2. java.lang.ClassCastException:net.sf.json.JSONArray无法强制转换为net.sf.json.JSONObject

  3. 请建议我如何解决此问题。

5 个答案:

答案 0 :(得分:0)

要将字符串中的JSON数组转换为JSONArray,请使用JSONArray.fromObject

JSONArray lineItems = JSONArray.fromObject(jsonString); // converts String to JSONArray
for (Object o : lineItems) {
  ...
}

JSONObject.getJSONArray用于将JSON对象的给定键检索为数组。

答案 1 :(得分:0)

["[{"Name":"name.pdf","ValueDate":"2016-08-30T22:00:00+0000"}]"] 该字符串不符合JSON语法。 首先删除前导["并尾随"]然后它将看起来像正确的JSON数组。

答案 2 :(得分:0)

无效

["[{"Name":"name.pdf","ValueDate":"2016-08-30T22:00:00+0000"}]"] 

但是这个有效

[[{"Name":"name.pdf","ValueDate":"2016-08-30T22:00:00+0000"}‌​]]

引用会破坏String的有效性。并且为了解析它,你需要循环两次。

    JSONArray lineItems = new JSONArray(listDocToSendJson);  
       for (int i = 0; i < lineItems.size(); i++) {
              JSONArray jsonArr = lineItems.getJSONArray(i);
              for (int x = 0; x < jsonArr.size(); x++) {
                   JSONObject jsonObj = lineItems.getJSONObject(i);
                   String name = jsonObj.getString("Name");
                   String valueDate = jsonObj.getString("ValueDate");
              }
       }
   }

答案 3 :(得分:0)

试试这个它应该工作..只是添加你的json字符串有一个问题我已经纠正了它应该作为

[{"Name":"name.pdf","ValueDate":"2016-08-30T22:00:00+0000"}]

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class JSONTest {
      public static void main(String[] args) {
            String jsonString ="[{\"Name\":\"name.pdf\",\"ValueDate\":\"2016-08-30T22:00:00+0000\"}]";

            System.out.println("jsonString" + jsonString);
            try {
                  JSONArray jsonArray = new JSONArray(jsonString);
                  for (int i=0;i<jsonArray.length();i++) {

                        JSONObject jsonObj = jsonArray.getJSONObject(i);
                        String name = jsonObj.getString("Name");
                        String valueDate = jsonObj.getString("ValueDate");
                        System.out.println("Name : "+name + "ValueDate : "+valueDate);
            }
            } catch (JSONException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
            }
      }
}

答案 4 :(得分:0)

最后,我能够从JSON字符串中检索元素,如下所示 [&#34; [{\&#34;名称\&#34;:\&#34; name.pdf \&#34; \&#34; ValueDate \&#34;:\&#34; 2016-08-30T22:00:00 + 0000 \&#34;}]&#34;] 我用了json.jar

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

jsonStringList = jsonStringList.substring(2, jsonStringList.length()-2); //removed brackets and double quotes 
    jsonStringList = jsonStringList.replaceAll("\\\\", ""); //remove extra backslashes
    System.out.println("jsonStringList "+jsonStringList); //valid json //[{"Name":"name.pdf","ValueDate":"2016-08-30T22:00:00+0000"}]
    try {
        JSONArray jsonArray = new JSONArray(jsonStringList);
        for (int i=0;i<jsonArray.length();i++) {

              JSONObject jsonObj = jsonArray.getJSONObject(i);
              String name = jsonObj.getString("Name");
              String valueDate = jsonObj.getString("ValueDate");
              System.out.println("Name : "+name + "ValueDate : "+valueDate);
  }

谢谢大家的帮助。 :)