解析有时在数组内部有数组的JSON

时间:2013-03-20 16:58:35

标签: android arrays json parsing

我正从我的网站检索JSON并尝试在我的Android应用程序中解析它。 这是后端生成的自动JSON。

只要上传了单张图片,我就会得到没有数组的图片链接。这是一个单独的字符串。

但是,如果上传的图片不止一个,我会将它们放在一个数组中。(参见下面的JSON)(JSON无效,因为我删除了一些我不使用的东西)

{
"Reports": [
    {
        "News": {
            "Title": "Big Explosion",
            "Info": "Lorem ipsum news etc here get here etc",
            "field_image": "http://mysite.com/1.jpg"
        }
    },
    {
        "News": {
            "Title": "2nd explosion",
            "Info": "<p>Us a delimited list ws etc here get her</p>\n",
            "field_image": [
                "http://mysite.com/2.jpg",
                "http://mysite.com/3.jpg",
                "http://mysite.com/4.jpg"
                           ]
        }
 ]
}

我使用以下代码来检索JSON。 但是,当存在多个图像时,我无法单独获取每个String。

JSONObject json = jParser.getJSONFromUrl(url);
 if (json != null)
        {
                JSONArray ReportsJsonArray = json.getJSONArray("Reports");
                for (int i = 0; i < ReportsJsonArray.length(); i++)
                {
                    JSONObject c = ReportsJsonArray .getJSONObject(i);
                    JSONObject news= node.getJSONObject("News");

                    String title = node.getString("Title");
                    String info = node.getString("Info");
                    String fieldImage = node.getString("fieldimage");

                    if (fieldImage.charAt(0) == '[')
                    {
                        Log.i("tag", "more than 1 image");
                                                // HOW TO GET THEM

                    } else
                    {
                        Log.i("tag", "single image");
                                               //already have them

                           }
    }

我的代码可以工作但是将整个数组作为单个字符串。 (我省略了try-catch块以使代码更简单。)

3 个答案:

答案 0 :(得分:1)

我认为你应该使用google gson jsonreader或android jsonreader,它可以从android API-11中获取每个令牌的JSONreader读取,你可以使用函数peek()来查看JSONToken类型,而不会消耗它在你的情况下它将是像这样

主要功能

//response from the server
    response = myClient.execute(myConnection);
    Reader streamReader = new InputStreamReader(response
                            .getEntity().getContent());
    JsonReader reader = new JsonReader(streamReader);

reader.beginObject();

    while (reader.hasNext()) {

        String name = reader.nextName();

        if (name.equals("reports")) {
            readReports(reader);
        } else {
            reader.skipValue(); // avoid some unhandle events
        }
    }

reader.endObject();
reader.close();

readReports函数

private void readReports(JsonReader reader) throws IOException {
    reader.beginArray();
    while(reader.hasNext()) {
    reader.beginObject();
    while (reader.hasNext()) {
        String objectNewsName = reader.nextName();
        if (objectNewsName .equals("News")) {
             readNews(reader);
        } else {
             reader.skipValue();
        }
    reader.endObject();

    }
    reader.endObject();
}

readNews功能

private void readNews(JsonReader reader) throws IOException {
    reader.beginObject();
    while(reader.hasNext()) {
        String objectNewsDataName = reader.nextName();
        if (objectNewsDataName .equals("Title")) {
             Log.d("NEWS",reader.nextString());
        } else if (objectNewsDataName .equals("Info")) {
             Log.d("NEWS",reader.nextString());
        } else if (objectNewsDataName .equals("field_image")) {
             if(reader.peek() == JsonToken.BEGIN_ARRAY) {
                 readFieldImage(reader);
             } else {
                 Log.d("NEWS",reader.nextString());
             }
        }else {
             reader.skipValue();
        }
    }
    reader.endObject();
}

readFieldImage函数

private void readFieldImage (JsonReader reader) throws IOException {
        reader.beginArray();
        while(reader.hasNext()) {
           Log.d("NEWS",reader.nextString());  //you will get the field image array content here
        }
    }

我希望我的答案足够明确,但如果您对我的答案有疑问,请随时在评论中提问:)

答案 1 :(得分:0)

你尝试过这个:

....
String title = node.getString("Title");
String info = node.getString("Info");
JSONArray fieldImageArray = node.getJSONArray("fieldimage");
//iterate fieldImageArray here
....

答案 2 :(得分:0)

试试这个

List<String> url= new ArrayList<String>();

     JSONArray field_image= news.getJSONArray("field_image");
    for (int i = 0; i < field_image.length(); i++) {
        url.add(field_image.get(i).toString());//adding to List
    }