web-dev-qa-db-fra.com

Comment analyser le fichier JSON local dans les actifs?

J'ai un fichier JSON dans mon dossier d'actifs. Ce fichier a un objet avec un tableau. Le tableau comprend plus de 150 objets, chacun ayant trois chaînes.

Pour chacun de ces 150+ objets, je veux extraire chaque chaîne et créer un objet modèle Java avec lui en passant les trois chaînes. Tous les tutoriels que je trouve sur Android L'analyse JSON récupère le JSON à partir d'une URL que je ne veux pas faire.

8
Nico

vous devez utiliser bibliothèque Gson comme analyseur json .

ajoutez cette dépendance dans le fichier de gradation de l'application:

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

créer un dossier brut dans le dossier res. puis copiez votre fichier json dans le dossier brut (il vaut mieux utiliser le dossier brut au lieu des ressources). par exemple, vous avez ce fichier json nommé my_json.json

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

puis créez votre classe de modèle :

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

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

alors vous devez créer une fonction pour lire votre fichier 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;
        }
    }

puis lisez votre fichier json:

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

puis convertissez la chaîne json en modèle:

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

maintenant votre Json a été converti en modèle! Félicitations!

22
faraz khonsari

Les réponses précédentes fonctionnent bien, mais si vous utilisez Kotlin, vous pouvez le faire de manière très agréable et concise en utilisant les classes du package kotlin.io.

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

Vous pouvez même vous transformer en une méthode d'extension générique Nice si vous souhaitez une réutilisation facile:

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

Que vous appelleriez alors simplement comme ceci:

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

vous devez d'abord lire le fichier json à partir des actifs, vous pouvez utiliser cette méthode

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;

}

ensuite

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