9

json文字列からjson配列を解析しようとしていますが、常に例外がスローされますdata of type java.lang.String cannot be converted to JSONArray

間違えたら教えてください。

ありがとう。

サーバーからJsonを取得するためのコードは次のとおりです。

try {
                String url = String.format(<url here>, province.provinceCode2);
                HttpClient httpClient = getHttpClient();
                HttpGet httpGet = new HttpGet(url);
                HttpResponse httpResponse = httpClient.execute(httpGet);
                HttpEntity entity = httpResponse.getEntity();
                final String result = EntityUtils.toString(entity);
                parseAndSaveJsonData(province, result);
            } catch (Exception e) {
                e.printStackTrace();
            }

JsonArrayを解析するためのコードは次のとおりです。

String jsonString = <below json string>
JSONArray ja = new JSONArray(jsonString);

これが私のjson文字列です:

   [
   {
      "LotPrizes":[
         {
            "Prize":"Giảitám",
            "Range":"50"
         },
         {
            "Prize":"Giảibảy",
            "Range":"264"
         },
         {
            "Prize":"Giảisáu",
            "Range":"3654-5162-3097"
         },
         {
            "Prize":"Giảinăm",
            "Range":"9739"
         },
         {
            "Prize":"Giảitư",
            "Range":"97690-99274-32442-69432-04855-10132-17085"
         },
         {
            "Prize":"Giảiba",
            "Range":"73745-13007"
         },
         {
            "Prize":"Giảinhì",
            "Range":"05521"
         },
         {
            "Prize":"Giảinhất",
            "Range":"74870"
         },
         {
            "Prize":"GiảiDB6",
            "Range":"878833"
         }
      ]
      },
 {
      "LotPrizes":[
         {
            "Prize":"Giảitám",
            "Range":"50"
         },
         {
            "Prize":"Giảibảy",
            "Range":"264"
         },
         {
            "Prize":"Giảisáu",
            "Range":"3654-5162-3097"
         },
         {
            "Prize":"Giảinăm",
            "Range":"9739"
         },
         {
            "Prize":"Giảitư",
            "Range":"97690-99274-32442-69432-04855-10132-17085"
         },
         {
            "Prize":"Giảiba",
            "Range":"73745-13007"
         },
         {
            "Prize":"Giảinhì",
            "Range":"05521"
         },
         {
            "Prize":"Giảinhất",
            "Range":"74870"
         },
         {
            "Prize":"GiảiDB6",
            "Range":"878833"
         }
      ]
      }

    ]
4

3 に答える 3

18

JSONパーサーを初期化する方法は次のとおりです。

JSONObject jsonObject = new JSONObject(jsonString);

これにより、文字列全体がJsonオブジェクトとして提供されます。そこから、次のように、個々の配列をJsonArrayとして引き出します。

JSONArray jsonArray = jsonObject.getJSONArray("LotPrizes");

各「LotPrizes」にアクセスするには、forループロジックを使用できます。

for(int i=0;i<jsonArray.length();i++)
{
  JSONObject curr = jsonArray.getJSONObject(i);

  prize = curr.getString("Prize")

//Do stuff with the Prize String here
//Add it to a list, print it out, etc.
}

編集:JSON編集後の最終コード:

JSONArray jsonArray = null;
String jsonString = <your string>
String currPrize = null;

JSONObject jsonObject = new JSONObject(jsonString);

jsonArray = jsonObject.getJSONArray("data");

for(int i=0;i<jsonArray.length();i++)
{
    JSONArray currLot = jsonArray.getJSONObject(i);

    for(int j=0; j<currLot.length();j++)
    {
        JSONobject curr = currLot.getJSONObject(j);

        currPrize = curr.getString("Prize");

        //Do something with Prize
    }
}

このコードは機能しており、コードでほぼ同じバージョンを使用しています。これが(最終的に)あなたのために働くことを願っています。

于 2013-01-28T16:33:12.890 に答える
2

こんにちは@Caerulius、Harish、ρяσѕρєяK、Hot Licks、そしてすべて。最後に、2日間の頭痛と2日間の眠れない夜の後、私は問題を解決しました。そして、あなたは私と話し合うためにあなたの大切な時間を費やしているので、私はあなたに根本的な原因を言わなければならないことがわかります。それが私の責任です。

まず第一に、私はシニアアンドロイド開発者です。したがって、私は少なくともJSONの基本について知っており、JSON文字列からデータを解析する方法を知っており、それを検証するための多くの便利なオンラインツールを知っています。サーバーから取得したJSON文字列が有効であることを確認します。

質問で言ったように、私はオブジェクトfinal String result = EntityUtils.toString(entity);からJSON文字列を取得していました。HttpEntity私はこれを過去に何度も使用しましたが、うまくいきました。問題ない。しかし、この場合はそうではありません。次のような元のJSON文字列:

   [{
      "LotPrizes":[
         {
            "Prize":"Giảitám",
            "Range":"50"
         },
         {
            "Prize":"Giảibảy",
            "Range":"264"
         },
         ...
    }]

しかし、私がこのように得たもの:

"[{
      \"LotPrizes\":[
         {
            \"Prize":\"Giảitám\",
            \"Range\":\"50\"
         },
         {
            \"Prize\":\"Giảibảy\",
            \"Range\":\"264\"
         },
         ...
    }]"

この文字列は、以下のように宣言できる定数文字列に似ています。

String stringVariable = "\"[{
          \\\"LotPrizes\\\":[
             {
                \\\"Prize":\\\"Giảitám\\\",
                \\\"Range\\\":\\\"50\\\"
             },
             {
                \\\"Prize\\\":\\\"Giảibảy\\\",
                \\\"Range\\\":\\\"264\\\"
             },
             ...
        }]\" ;

これは有効な文字列ですが、有効なJSON文字列ではありません。

この問題を修正するために、JSON文字列を取得する方法を変更し、次のような不要な文字を削除します。

                            HttpClient httpClient = getHttpClient();
                HttpGet httpGet = new HttpGet(url);
                HttpResponse httpResponse = httpClient.execute(httpGet);
                HttpEntity entity = httpResponse.getEntity();
                InputStream is = entity.getContent();
                BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"), 8);
                StringBuilder sb = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
                }
                is.close();
                String json = sb.toString();

                json = json.replace("\\", "");
                json = json.substring(1);
                json = json.substring(0, json.length() - 2);

これで、json変数に正しく解析できるJSON文字列が含まれます。これはHttpEntityライブラリのバグだと思います。

これが他の人の助けになることを願っています。

于 2013-01-29T17:21:14.233 に答える
1

次のように、文字列からjsondataを取得できます。

            JSONObject json = new JSONObject(jsonString);
            JSONArray jData = json.getJSONArray("data");
            for (int i = 0; i < jData.length(); i++) {
                JSONObject jo = jData.getJSONObject(i);

                JSONArray jLotPrizes = jo.getJSONArray("LotPrizes");
                for (int j = 0; j < jLotPrizes.length(); j++) {
                    JSONObject jobj = jLotPrizes.getJSONObject(j);

                    Log.i("Prize", "" + jobj.getString("Prize"));
                    Log.i("Range", "" + jobj.getString("Range"));
                }

            }
于 2013-01-29T12:09:53.917 に答える