【问题标题】:How to parse local JSON file in assets?如何解析资产中的本地 JSON 文件?
【发布时间】:2017-12-23 22:06:47
【问题描述】:

我的资产文件夹中有一个 JSON 文件。该文件有一个带有数组的对象。该数组有 150 多个对象,每个对象都有三个字符串。

对于这 150 多个对象中的每一个,我想提取每个字符串并创建一个 java 模型对象,并通过它传递三个字符串。我在 android JSON 解析上找到的所有教程都是从我不想做的 url 中获取 JSON。

【问题讨论】:

  • 为什么从哪里获取 JSON 很重要?教程实际上是获取字符串,然后您创建new JSONObject(String)...所以,将assets 文件加载到字符串
  • @cricket_007 对不起,如果菜鸟问题,但您总是需要将 JSON 文件转换为字符串然后解析字符串吗?可以直接解析JSON文件吗?
  • 这是可以理解的问题 :) 您可以使用 JsonReader developer.android.com/reference/android/util/JsonReader.html 解析 InputStream

标签: android json android-assets


【解决方案1】:

您应该使用 Gson library 作为 json 解析器

在 app gradle 文件中添加这个依赖:

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

在 res 文件夹中创建 raw 文件夹。然后将您的 json 文件复制到原始文件夹。(最好使用原始文件夹而不是资产)。例如,您有一个名为 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 已转换为模型! 恭喜!

【讨论】:

  • 以及如何使用:MyModel myModel = new Gson().fromJson(myJson, MyModel.class); ?或者我如何访问属性模型
  • @xx_name 例如,如果您想要访问第一个对象的名称:myModel.list.get(0).name
  • @farazkhonsari “最好使用原始文件夹而不是资产”。请解释一下。
【解决方案2】:

以前的答案效果很好,但如果您使用的是 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)

【讨论】:

    【解决方案3】:

    首先需要从assets中读取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));
    }
    

    【讨论】:

    【解决方案4】:

    将你的 json 文件放在 raw 文件夹中,你可以使用 Gson 库来解析 json:

    Reader reader= new InputStreamReader(getResources().openRawResource(R.raw.json_test));
    JsonElement json=new Gson().fromJson(reader,JsonElement.class); 
    

    您可以将此 JsonElemnt 用于 Gson,或者如果您希望将 json 作为字符串,您可以这样做:

    String jsonString=json.toString();
    

    【讨论】:

      猜你喜欢
      • 2013-11-25
      • 2014-05-08
      • 2012-08-22
      • 2019-06-03
      • 2016-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-23
      相关资源
      最近更新 更多