web-dev-qa-db-ja.com

アセット内のローカルJSONファイルを解析する方法は?

アセットフォルダーにJSONファイルがあります。そのファイルには、配列を持つ1つのオブジェクトがあります。配列には、それぞれ3つの文字列を持つ150以上のオブジェクトがあります。

これらの150以上のオブジェクトのそれぞれについて、各文字列を抽出し、3つの文字列を渡すJavaモデルオブジェクトを作成します。Android JSON解析は、私がしたくないURLからJSONを取得しています。

8
Nico

Gsonライブラリjsonパーサーとして使用する必要があります

この依存関係をアプリのgradleファイルに追加します。

compile 'com.google.code.gson:gson:2.8.1'

resフォルダーにrawフォルダーを作成します。次に、jsonファイルをrawフォルダーにコピーします(アセットの代わりにrawフォルダーを使用する方が適切です)。たとえば、my_json.jsonという名前のこのjsonファイルがあります

{
  "list": [
    {
      "name": "Faraz Khonsari",
      "age": 24
    },
    {
      "name": "John Snow",
      "age": 28
    },
    {
      "name": "Alex Kindman",
      "age": 29
    }
  ]
} 

次に、モデルクラスを作成します

public class MyModel {
        @SerializedName("list")
        public ArrayList<MyObject> list;

       static public class MyObject {
            @SerializedName("name")
            public String name;
            @SerializedName("age")
            public int age;
        }
    }

次に、jsonファイルを読み取る関数を作成する必要があります。

public String inputStreamToString(InputStream inputStream) {
        try {
            byte[] bytes = new byte[inputStream.available()];
            inputStream.read(bytes, 0, bytes.length);
            String json = new String(bytes);
            return json;
        } catch (IOException e) {
            return null;
        }
    }

次に、jsonファイルを読み取ります。

String myJson=inputStreamToString(mActivity.getResources().openRawResource(R.raw.my_json));

次に、json文字列をモデルに変換します。

MyModel myModel = new Gson().fromJson(myJson, MyModel.class);

jsonがモデルに変換されました! おめでとうございます!

22
faraz khonsari

以前の回答はうまく機能しますが、Kotlinを使用している場合は、kotlin.ioパッケージのクラスを使用して、非常に簡潔かつ簡潔に行うことができます。

val objectArrayString: String = context.resources.openRawResource(R.raw.my_object).bufferedReader().use { it.readText() }
val objectArray = Gson().fromJson(objectArrayString, MyObject::class.Java)

簡単に再利用したい場合は、ニースの汎用拡張メソッドに変えることもできます。

inline fun <reified T> Context.jsonToClass(@RawRes resourceId: Int): T =
        Gson().fromJson(resources.openRawResource(resourceId).bufferedReader().use { it.readText() }, T::class.Java)

次に、次のように単純に呼び出します。

context.jsonToClass<MyObject>(R.raw.my_object)
1
Casper

最初にアセットからjsonファイルを読み取る必要があります。このメソッドを使用できます

public String readFile(String fileName) throws IOException
{
  BufferedReader reader = null;
  reader = new BufferedReader(new InputStreamReader(getAssets().open(fileName), "UTF-8")); 

  String content = "";
  String line;
  while ((line = reader.readLine()) != null) 
  {
     content = content + line
  }

  return content;

}

それから

String jsonFileContent = readFile("json_in_assets.json");
JSONArray jsonArray = new JSONArray(jsonFileContent);
List<Person> persons = new ArrayList<>();
for (int i=0;i<jsonArray.length();i++)
{
  JSONObject jsonObj = jsonArray.getJSONObject(i);
  Integer id = jsonObj.getInt("id");
  String name = jsonObj.getString("name");
  String phone = jsonObj.getString("phone");
  persons.add(new Person(id , name , phone));
}
1
Ali