JSONarrayをArrayListに変換する


104

JSON文字列をダウンロードしてJSONArrayに変換しています。私はそれをリストビューに入れて、後でそのリストビューから削除できるようにする必要があります。JSONArrayには.removeメソッドがないため(おかげでオバマさん)、それを配列リストに変換しようとしています。

ここに私のJSONがあります(array.toString()):

[{"thumb_url":"tb-1370913834.jpg","event_id":"15","count":"44","event_tagline":"this is a tagline","event_name":"5th birthday","event_end":"1370919600","event_start":"1370876400"}]

それを配列に入れて、それぞれのキーで文字列を呼び出せるようにする必要があります。どんな助けにも感謝します!


キーを言うとき、それはある種の辞書(Androidのマップ)を意味するのではないですか?配列はインデックスベースになります。作成および使用方法については、developer.android.com / reference / java / util / Map.htmlをご覧ください。
brianestey 2013年

マップを使用して、リストビューにカスタムベースアダプターを設定できますか?JSONが順序を変更する場合に備えて、インデックスを使用しないでください。
TheGeekNess 2013年

ListViewは、インデックスからアダプタからオブジェクトを取得するため、どのような場合でも、リストをある順序で維持する必要があります。キーの順序を維持したい(そしてコンパイル時にキーが何であるかを知りたい)場合は、それらのキーの配列を好きな順序でハードコードし、それをマップからフェッチするときに順序に使用できます。
brianestey 2013年

回答:


164
ArrayList<String> listdata = new ArrayList<String>();     
JSONArray jArray = (JSONArray)jsonObject; 
if (jArray != null) { 
   for (int i=0;i<jArray.length();i++){ 
    listdata.add(jArray.getString(i));
   } 
} 

3
そしてlistdata.add(jArray.optJSONObject(i));、リストデータがJSONObject arrayListの場合。ArrayList<JSONObject> listdata = new ArrayList<JSONObject>();
Subin Sebastian 2014

2
良いスニペット。誰かが望む場合に備えて:github gist.github.com/codebutler/2339666に
inexcii

2
なぜ使用しないのArrayList<Object>ですか?
natanavra 2015年

Json配列を処理する方法は空です。仲間に返信してください。
MohanRaj S 2016

3
ループなしでこれを行う他の方法はありますか?
K.Sopheak 2017年

64

私はGson(by Google)を使ってそれをやった。

次の行をモジュールのに追加しますbuild.gradle

dependencies {
  // ...
  // Note that `compile` will be deprecated. Use `implementation` instead.
  // See https://stackoverflow.com/a/44409111 for more info
  implementation 'com.google.code.gson:gson:2.8.2'
}

JSON ストリング:

private String jsonString = "[\n" +
            "        {\n" +
            "                \"id\": \"c200\",\n" +
            "                \"name\": \"Ravi Tamada\",\n" +
            "                \"email\": \"ravi@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c201\",\n" +
            "                \"name\": \"Johnny Depp\",\n" +
            "                \"email\": \"johnny_depp@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c202\",\n" +
            "                \"name\": \"Leonardo Dicaprio\",\n" +
            "                \"email\": \"leonardo_dicaprio@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c203\",\n" +
            "                \"name\": \"John Wayne\",\n" +
            "                \"email\": \"john_wayne@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c204\",\n" +
            "                \"name\": \"Angelina Jolie\",\n" +
            "                \"email\": \"angelina_jolie@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"female\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c205\",\n" +
            "                \"name\": \"Dido\",\n" +
            "                \"email\": \"dido@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"female\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c206\",\n" +
            "                \"name\": \"Adele\",\n" +
            "                \"email\": \"adele@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"female\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c207\",\n" +
            "                \"name\": \"Hugh Jackman\",\n" +
            "                \"email\": \"hugh_jackman@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c208\",\n" +
            "                \"name\": \"Will Smith\",\n" +
            "                \"email\": \"will_smith@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c209\",\n" +
            "                \"name\": \"Clint Eastwood\",\n" +
            "                \"email\": \"clint_eastwood@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c2010\",\n" +
            "                \"name\": \"Barack Obama\",\n" +
            "                \"email\": \"barack_obama@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c2011\",\n" +
            "                \"name\": \"Kate Winslet\",\n" +
            "                \"email\": \"kate_winslet@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"female\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c2012\",\n" +
            "                \"name\": \"Eminem\",\n" +
            "                \"email\": \"eminem@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        }\n" +
            "    ]";

ContactModel.java

public class ContactModel {
     public String id;
     public String name;
     public String email;
}

JSON文字列をに変換するコードArrayList<Model>

注:インポートする必要がありますjava.lang.reflect.Type;

// Top of file
import java.lang.reflect.Type;

// ...

private void parseJSON() {
    Gson gson = new Gson();
    Type type = new TypeToken<List<ContactModel>>(){}.getType();
    List<ContactModel> contactList = gson.fromJson(jsonString, type);
    for (ContactModel contact : contactList){
        Log.i("Contact Details", contact.id + "-" + contact.name + "-" + contact.email);
    }
}

これがお役に立てば幸いです。


4
3行...完了!これは、(a)美しく機能するコードが3行しかないこと、および(b)実際にJSONArrayからList <CustomObject>への型指定された変換を実行することから、受け入れられるべき回答だったと思います。ありがとうございました!
John Ward

JSONArrayである必要があります。JSONElementは機能していないようです。そのため、getAsJsonArray()メソッドを一見使用します。ありがとうございました!
嘉恒陶

1
本当に必要なもの、ありがとう!注:これらをインポートする必要があります:java.lang.reflect.Type; com.google.gson.reflect.TypeToken;
Chandrani H

すばらしい、これは受け入れられた答えであるはずです!。ありがとう
Yeuni

typetokenのinitが保護されているため、これは機能しません
nikoss

7

この方法を試す単純にループして、独自の配列を作成します。このコードは、それが文字列の配列であることを前提としています。特定の配列構造に合わせて変更することは難しくありません。

JSONArray jsonArray = new JSONArray(jsonArrayString);
List<String> list = new ArrayList<String>();
for (int i=0; i<jsonArray.length(); i++) {
    list.add( jsonArray.getString(i) );

6

JSON文字列をArrayListまたはMapに変換する代わりに、JSONObject自体を作成できます。このオブジェクトには、必要に応じてキー文字列値取得たり、オブジェクト削除したりする機能があります

JSONObject適切にフォーマットされたJSON文字列からを作成するには、適切なコンストラクターを呼び出すだけです。

JSONObject json = new JSONObject(jsonString);

1
特にこのソリューションで遭遇する問題は、JSONObjectとJSONArrayを処理するときにJSONExceptionをスローすることです。JSONArrayの内容を、JSONを意識する必要のない関数に渡すと便利な場合があります。
アーロン・ドウアティ、2015

2
同意する。JSONObjectを使用して、JSONテキストを使用可能なモデルオブジェクトに解析します。発生したJSONExceptionは、ソースJSONに問題があることを示します。つまり、別のモデルオブジェクトはもちろん、JSONArrayまたはJSONObjectに解析することができません。
brianestey

6

私は速い解決策を持っています。ファイルを作成するだけArrayUtil.java

import java.util.ArrayList;
import java.util.Collection;
import org.json.JSONArray;
import org.json.JSONException;

public class ArrayUtil
{
    public static ArrayList<Object> convert(JSONArray jArr)
    {
        ArrayList<Object> list = new ArrayList<Object>();
        try {
            for (int i=0, l=jArr.length(); i<l; i++){
                 list.add(jArr.get(i));
            }
        } catch (JSONException e) {}

        return list;
    }

    public static JSONArray convert(Collection<Object> list)
    {
        return new JSONArray(list);
    }

}

使用法:

ArrayList<Object> list = ArrayUtil.convert(jArray);

または

JSONArray jArr = ArrayUtil.convert(list);

返却する必要がある場合はどうすればよいですかArrayList<String>

ArrayList <Object>をArrayList <String>にキャストすることは不可能だと思います
Vasilii Suricov

1
この答えに対する称賛。Uは私の日を解決しました!これを修正するために2時間を費やしました。実は私の問題は、私は、変換を入れたかったJSONArray私は置くことができるように一覧にListしてHashMap、このutilのはかなりよく私のために働いたそう。ありがとう@Vasilii Suricov
Jose Mhlanga

5

Java 8では

IntStream.range(0,jsonArray.length()).mapToObj(i->jsonArray.getString(i)).collect(Collectors.toList())

1
これの唯一の問題は、JSONArray.getString(...)がマッピング内で処理する必要のある例外をスローすることです。そのため、これほどList<String> listOfStrings = IntStream.range(0, array.length()).mapToObj(i -> { try { return array.getString(i); } catch (JSONException e) { throw new AssertionFailedError("JSONArray is not a list of Strings! " + e.getMessage()); } }).collect(Collectors.toList());エレガントではなくなります。だから私はforeachで行きます:)
LazR

これはここでの最良の答えです(imho)が、jsonArray参照に2回以上アクセスする必要がない方法があればエレガントです。
djangofan

4
 JSONArray array = new JSONArray(json);
 List<JSONObject> list = new ArrayList();
 for (int i = 0; i < array.length();list.add(array.getJSONObject(i++)));

2

便利にするには、POJOを使用します。

このようにしてみてください。

List<YourPojoObject> yourPojos = new ArrayList<YourPojoObject>();

JSONObject jsonObject = new JSONObject(jsonString);
YourPojoObject yourPojo = new YourPojoObject();
yourPojo.setId(jsonObject.getString("idName"));
...
...

yourPojos.add(yourPojo);

1

Gsonの使用

    List<Student> students = new ArrayList<>();
    JSONArray jsonArray = new JSONArray(stringJsonContainArray);
    for (int i = 0; i < jsonArray.length(); i++) {
        Student student = new Gson().fromJson(jsonArray.get(i).toString(), Student.class);
        students.add(student);
    }
    return students;

1

JSON文字列配列からデータを抽出する場合は、次のコードを使用してください。データとしてパラメータを変更します。


PoJoクラス

public class AllAppModel {
    private String appName;
    private String packageName;
    private int uid;
    private boolean isSelected;
    private boolean isSystemApp;
    private boolean isFav;
}

以下のコード行を使用してデータを抽出します

try {
    JSONArray jsonArr = new JSONArray("Your json string array");
    List<AllAppModel> lstExtrextData = new ArrayList<>();
    for (int i = 0; i < jsonArr.length(); i++) {
        JSONObject jsonObj = jsonArr.getJSONObject(i);
        AllAppModel data = new AllAppModel();
        data.setAppName(jsonObj.getString("appName"));
        data.setPackageName(jsonObj.getString("packageName"));
        data.setUid(jsonObj.getInt("uid"));
        data.setSelected(jsonObj.getBoolean("isSelected"));
        data.setSystemApp(jsonObj.getBoolean("isSystemApp"));
        data.setFav(jsonObj.getBoolean("isFav"));
        lstExtrextData.add(data);
    }
} catch (JSONException e) {
    e.printStackTrace();
}

PoJoクラスオブジェクトのリストを返します。


1

Java 8スタイル

   JSONArray data = jsonObject.getJSONArray("some-node");

   List<JSONObject> list = StreamSupport.stream(data.spliterator(), false)
                .map(e -> (JSONObject)e)
                .collect(Collectors.toList());

0
public static List<JSONObject> getJSONObjectListFromJSONArray(JSONArray array) 
        throws JSONException {
  ArrayList<JSONObject> jsonObjects = new ArrayList<>();
  for (int i = 0; 
           i < (array != null ? array.length() : 0);           
           jsonObjects.add(array.getJSONObject(i++))
       );
  return jsonObjects;
}

0

私は速い解決策を持っています。ファイルを作成するだけArrayUtil.java

ObjectMapper mapper = new ObjectMapper(); 
List<Student> list = Arrays.asList(mapper.readValue(jsonString, Student[].class));

使用法:

ArrayList<Object> list = ArrayUtil.convert(jArray);

または

JSONArray jArr = ArrayUtil.convert(list);

0

ジェネリックバリアント

public static <T> List<T> getList(JSONArray jsonArray) throws Exception {

    List<T> list = new ArrayList<>(jsonArray.length());

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

        list.add((T)jsonArray.get(i));
    }

    return list;

}

//Usage

List<String> listKeyString = getList(dataJsonObject.getJSONArray("keyString"));

0
ArrayList<String> listdata = new ArrayList<String>();     
JSONArray jArray = (JSONArray)jsonObject; 
if (jArray != null) { 
 listdata.addAll(jArray);
}

@simplified


0

スレッドの元の件名に沿って説明します。

jsonarrayをリストに変換する(ここではjackson jsonarrayとオブジェクトマッパーを使用):

ObjectMapper mapper = new ObjectMapper();
JSONArray array = new JSONArray();
array.put("IND");
array.put("CHN");
List<String> list = mapper.readValue(array.toString(), List.class);

0

より単純なJava 8の代替:

JSONArray data = new JSONArray(); //create data from this -> [{"thumb_url":"tb-1370913834.jpg","event_id":...}]

List<JSONObject> list = data.stream().map(o -> (JSONObject) o).collect(Collectors.toList());
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.