1

ウェブサイトからJSONを取得し、Androidアプリで解析しようとしています。これは、バックエンドによって生成される自動JSONです。

アップロードされた画像が1つしかない場合は常に、配列なしで画像のリンクを取得しています。それは単一の文字列です。

ただし、複数の画像がアップロードされた場合は、それらを配列内に取得します(以下の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を取得するために以下のコードを使用しています。ただし、複数の画像がある場合、各文字列を単独で取得することはできません。

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ブロックを省略しました)。

4

3 に答える 3

1

Android API-11から利用できるgoogle gson jsonreaderまたはandroid jsonreaderを使用する必要があると思います.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();

readReport 関数

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
        }
    }

私の答えが十分に明確であることを願っていますが、私の答えについて質問がある場合は、コメントでお気軽にお尋ねください:)

于 2013-03-20T17:25:37.020 に答える
0

これを試しましたか:

....
String title = node.getString("Title");
String info = node.getString("Info");
JSONArray fieldImageArray = node.getJSONArray("fieldimage");
//iterate fieldImageArray here
....
于 2013-03-20T17:09:18.557 に答える
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
    }
于 2013-03-20T17:10:56.797 に答える