Using JSON File in Android App Resources

前端 未结 8 1144
盖世英雄少女心
盖世英雄少女心 2020-11-28 21:00

Suppose I have a file with JSON contents in the raw resources folder in my app. How can I read this into the app, so that I can parse the JSON?

相关标签:
8条回答
  • 2020-11-28 21:04

    I used @kabuko's answer to create an object that loads from a JSON file, using Gson, from the Resources:

    package com.jingit.mobile.testsupport;
    
    import java.io.*;
    
    import android.content.res.Resources;
    import android.util.Log;
    
    import com.google.gson.Gson;
    import com.google.gson.GsonBuilder;
    
    
    /**
     * An object for reading from a JSON resource file and constructing an object from that resource file using Gson.
     */
    public class JSONResourceReader {
    
        // === [ Private Data Members ] ============================================
    
        // Our JSON, in string form.
        private String jsonString;
        private static final String LOGTAG = JSONResourceReader.class.getSimpleName();
    
        // === [ Public API ] ======================================================
    
        /**
         * Read from a resources file and create a {@link JSONResourceReader} object that will allow the creation of other
         * objects from this resource.
         *
         * @param resources An application {@link Resources} object.
         * @param id The id for the resource to load, typically held in the raw/ folder.
         */
        public JSONResourceReader(Resources resources, int id) {
            InputStream resourceReader = resources.openRawResource(id);
            Writer writer = new StringWriter();
            try {
                BufferedReader reader = new BufferedReader(new InputStreamReader(resourceReader, "UTF-8"));
                String line = reader.readLine();
                while (line != null) {
                    writer.write(line);
                    line = reader.readLine();
                }
            } catch (Exception e) {
                Log.e(LOGTAG, "Unhandled exception while using JSONResourceReader", e);
            } finally {
                try {
                    resourceReader.close();
                } catch (Exception e) {
                    Log.e(LOGTAG, "Unhandled exception while using JSONResourceReader", e);
                }
            }
    
            jsonString = writer.toString();
        }
    
        /**
         * Build an object from the specified JSON resource using Gson.
         *
         * @param type The type of the object to build.
         *
         * @return An object of type T, with member fields populated using Gson.
         */
        public <T> T constructUsingGson(Class<T> type) {
            Gson gson = new GsonBuilder().create();
            return gson.fromJson(jsonString, type);
        }
    }
    

    To use it, you'd do something like the following (the example is in an InstrumentationTestCase):

       @Override
        public void setUp() {
            // Load our JSON file.
            JSONResourceReader reader = new JSONResourceReader(getInstrumentation().getContext().getResources(), R.raw.jsonfile);
            MyJsonObject jsonObj = reader.constructUsingGson(MyJsonObject.class);
       }
    
    0 讨论(0)
  • 2020-11-28 21:06

    Using:

    String json_string = readRawResource(R.raw.json)
    

    Functions:

    public String readRawResource(@RawRes int res) {
        return readStream(context.getResources().openRawResource(res));
    }
    
    private String readStream(InputStream is) {
        Scanner s = new Scanner(is).useDelimiter("\\A");
        return s.hasNext() ? s.next() : "";
    }
    
    0 讨论(0)
  • 2020-11-28 21:07

    Found this Kotlin snippet answer very helpful ♥️

    While the original question asked to get a JSON String, I figure some might find this useful. A step further with Gson leads to this little function with reified type:

    private inline fun <reified T> readRawJson(@RawRes rawResId: Int): T {
        resources.openRawResource(rawResId).bufferedReader().use {
            return gson.fromJson<T>(it, object: TypeToken<T>() {}.type)
        }
    }
    

    Note you want to use TypeToken not just T::class so if you read a List<YourType> you won't lose the type by type erasure.

    With the type inference you can then use like this:

    fun pricingData(): List<PricingData> = readRawJson(R.raw.mock_pricing_data)
    
    0 讨论(0)
  • 2020-11-28 21:12

    See openRawResource. Something like this should work:

    InputStream is = getResources().openRawResource(R.raw.json_file);
    Writer writer = new StringWriter();
    char[] buffer = new char[1024];
    try {
        Reader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
        int n;
        while ((n = reader.read(buffer)) != -1) {
            writer.write(buffer, 0, n);
        }
    } finally {
        is.close();
    }
    
    String jsonString = writer.toString();
    
    0 讨论(0)
  • 2020-11-28 21:15
    InputStream is = mContext.getResources().openRawResource(R.raw.json_regions);
                                int size = is.available();
                                byte[] buffer = new byte[size];
                                is.read(buffer);
                                is.close();
                               String json = new String(buffer, "UTF-8");
    
    0 讨论(0)
  • 2020-11-28 21:16

    Kotlin is now official language for Android, so I think this would be useful for someone

    val text = resources.openRawResource(R.raw.your_text_file)
                                     .bufferedReader().use { it.readText() }
    
    0 讨论(0)
提交回复
热议问题