AndroidでJSON配列(Jsonオブジェクトではない)を解析する方法


89

JSONArrayを解析する方法を見つけるのに苦労します。次のようになります。

[{"name":"name1","url":"url1"},{"name":"name2","url":"url2"},...]

JSONが別の方法で記述されている場合(つまり、オブジェクトの配列の代わりにjsonオブジェクトが返された場合)の解析方法を知っています。しかし、それは私が持っているすべてのことであり、それと一緒に行かなければなりません。

*編集:これは有効なjsonです。このjsonを使用してiPhoneアプリを作成しましたが、今はAndroid用に実行する必要があり、理解できません。そこには多くの例がありますが、それらはすべてJSONObjectに関連しています。JSONArrayに何か必要です。

誰かが私にいくつかのヒント、またはチュートリアルや例を教えてもらえますか?

とても有難い !


1
あなたのJSONが有効であるかどうかを確認するために、これを試してみてくださいjson.parser.online.fr
アン・ドロイド

jsonの解析にライブラリを使用していますか?jsonの解析にはgsonライブラリを使用してください。
nilkash 2013

有効です。私はiPhoneのためにやったアプリでそれをパースしました、そしてそれは働いています。私はちょうどそれをAndroidで行う方法を知らない
SteBra

1
@nikash、ええ、私はgsonを使用できることに気づきました。唯一の問題は、私が見つけたすべての例はJSONArrayではなくJSONObjectを解析するためのものです
SteBra

これまでに試したコードを投稿してください。それに応じて正確な答えを出すと役立ちます。
スプリングブレーカー

回答:


144

次のスニペットを使用してJsonArrayを解析します。

JSONArray jsonarray = new JSONArray(jsonStr);
for (int i = 0; i < jsonarray.length(); i++) {
    JSONObject jsonobject = jsonarray.getJSONObject(i);
    String name = jsonobject.getString("name");
    String url = jsonobject.getString("url");
}

それが役に立てば幸い。


jsonarrayに[2]。[4]のような数値が含まれている場合の1つの質問 内部の数値には配列が含まれているため、特に取得したい場合は、Javaコードで数値[4]にネストされた配列と言って、int i = 4 ???
BiggDawgg 2015

@BiggDawgg:お役に立てて嬉しいです。JSONデータを含む別のスレッドに質問を投稿して、答えが簡単になるようにします。
スプリングブレーカー、

26

ジャクソンの例を少し挙げておきます。

最初に、JSON文字列のフィールドを持つデータホルダーを作成します

// imports
// ...
@JsonIgnoreProperties(ignoreUnknown = true)
public class MyDataHolder {
    @JsonProperty("name")
    public String mName;

    @JsonProperty("url")
    public String mUrl;
}

MyDataHoldersのリストを解析します

String jsonString = // your json
ObjectMapper mapper = new ObjectMapper();
List<MyDataHolder> list = mapper.readValue(jsonString, 
    new TypeReference<ArrayList<MyDataHolder>>() {});

リストアイテムの使用

String firstName = list.get(0).mName;
String secondName = list.get(1).mName;

JSONをURLから文字列として取得する方法の例を教えてください。
SteBra 2013

1
DefaultHttpClientsが実行-方法は、それが別のクラスである理由だけで明確にするために、バックグラウンドタスクで実行する必要がありますので着信拒否です。
vilpe89 2013

HttpGetTaskのコンストラクタに関するエラーが表示されます。「コンストラクターHttpGetTask(OnHttpGetCompletedListener)が欠落している型OnHttpGetCompletedListenerを参照しています」
SteBra

1
OnHttpGetCompletedListenerをインポートしましたか?このようにimport your_package_name_here.HttpGetTask.OnHttpGetCompletedListener;
vilpe89

1
はい、それが問題でした...私の問題を解決してくれてありがとう:)
SteBra

19
public static void main(String[] args) throws JSONException {
    String str = "[{\"name\":\"name1\",\"url\":\"url1\"},{\"name\":\"name2\",\"url\":\"url2\"}]";

    JSONArray jsonarray = new JSONArray(str);


    for(int i=0; i<jsonarray.length(); i++){
        JSONObject obj = jsonarray.getJSONObject(i);

        String name = obj.getString("name");
        String url = obj.getString("url");

        System.out.println(name);
        System.out.println(url);
    }   
}   

出力:

name1
url1
name2
url2

12

オブジェクトを保持するクラスを作成します。

public class Person{
   private String name;
   private String url;
   //Get & Set methods for each field
}

次に、次のように逆シリアル化します。

Gson gson = new Gson();
Person[] person = gson.fromJson(input, Person[].class); //input is your String

参照記事: http : //blog.patrickbaumann.com/2011/11/gson-array-deserialization/


この「入力」はそのjsonへのURLになると思いますか?それとも何か他のものですか?
SteBra 2013

これは非常にシンプルなソリューションです。それは私の見解では受け入れられるべきものです
FabioC 2017年

6

@Stebraこの例を参照してください。これはあなたを助けるかもしれません。

public class CustomerInfo 
{   
    @SerializedName("customerid")
    public String customerid;
    @SerializedName("picture")
    public String picture;

    @SerializedName("location")
    public String location;

    public CustomerInfo()
    {}
}

そして、あなたが結果を得るとき; このように解析する

List<CustomerInfo> customers = null;
customers = (List<CustomerInfo>)gson.fromJson(result, new TypeToken<List<CustomerInfo>>() {}.getType());

1
結果変数はJSONArray文字列です
nilkash '

結果変数は、jsonをフェッチする必要があるURLか、すでにjsonをフェッチしたURLですか?
SteBra 2013

はるかに簡単なソリューション
0x6C38

6

この例では、1つのjson配列内にいくつかのオブジェクトがあります。あれは、

これはjson配列です:[{"name": "name1"、 "url": "url1"}、{"name": "name2"、 "url": "url2"}、...]

これは1つのオブジェクトです:{"name": "name1"、 "url": "url1"}

jSonResultStringと呼ばれるString変数に結果を取得したと仮定します。

JSONArray arr = new JSONArray(jSonResultString);

  //loop through each object
  for (int i=0; i<arr.length(); i++){

  JSONObject jsonProductObject = arr.getJSONObject(i);
  String name = jsonProductObject.getString("name");
  String url = jsonProductObject.getString("url");


}

URLからJSONstringを取得するのに苦労しています。多分あなたはそれを助けることができますか?
SteBra 2013


3

いくつかのすばらしい提案がすでに述べられています。GSONの使用は本当に便利です。生活をより簡単にするために、このWebサイトを試すことができます 。

あなたはそれにあなたのjsonを与え、それはあなたのプロジェクトに貼り付けることができるJavaオブジェクトを生成します。GSONを選択して変数に注釈を付けることができるため、jsonからのオブジェクトの抽出がさらに簡単になります。


2

私の場合は、サーバーからロードの例です。

int jsonLength = Integer.parseInt(jsonObject.getString("number_of_messages"));
            if (jsonLength != 1) {
                for (int i = 0; i < jsonLength; i++) {
                    JSONArray jsonArray = new JSONArray(jsonObject.getString("messages"));
                    JSONObject resJson = (JSONObject) jsonArray.get(i);
                    //addItem(resJson.getString("message"), resJson.getString("name"), resJson.getString("created_at"));
                }

それが役に立てば幸い


ps "jsonObject.getString(" messages ")"タイプはjsonArrayです。最初に存在する答えは、文字列をjsonArrayに変換できないことです。私はそれを修正します。
'2015年

-1

次のようにリスト内のオブジェクトのPOJO Javaクラスを作成します。

class NameUrlClass{
       private String name;
       private String url;
       //Constructor
       public NameUrlClass(String name,String url){
              this.name = name;
              this.url = url; 
        }
}

次に、NameUrlClassのリストを作成し、次のようにArrayListに初期化します。

List<NameUrlClass> obj = new ArrayList<NameUrlClass>;

このオブジェクトにJSON配列を格納して使用できます

obj = JSONArray;//[{"name":"name1","url":"url1"}{"name":"name2","url":"url2"},...]

1
何をすべきか明確でobj = JSONArray;はありません。JSONArrayこの文脈には何がありますか?それはどこから来たのですか?初期化の目的は何であるobjnew ArrayList<NameUrlClass>あなたはとにかく直接後でそれを交換する場合、?
Max Vollmer、2018年

-3

古い記事は知っていますが、質問を誤解していない限り、これでうまくいくはずです。

s = '[{"name":"name1","url":"url1"},{"name":"name2","url":"url2"}]';
eval("array=" + s);
for (var i = 0; i < array.length; i++) {
for (var index in array[i]) {
    alert(array[i][index]);
}

}


-3
            URL url = new URL("your URL");
            connection = (HttpURLConnection) url.openConnection();
            connection.connect();
            InputStream stream = connection.getInputStream();
            BufferedReader reader;
            reader = new BufferedReader(new InputStreamReader(stream));
            StringBuffer buffer = new StringBuffer();
            String line = "";
            while ((line = reader.readLine()) != null) {
                buffer.append(line);
            }

            //setting the json string
            String finalJson = buffer.toString();

            //this is your string get the pattern from buffer.
            JSONArray jsonarray = new JSONArray(finalJson);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.