অ্যান্ড্রয়েড অ্যাপ রিসোর্সে JSON ফাইল ব্যবহার করা


88

ধরুন আমার অ্যাপ্লিকেশনে কাঁচা সংস্থান ফোল্ডারে জেএসওন সামগ্রীগুলির সাথে আমার একটি ফাইল রয়েছে। আমি কীভাবে এটি অ্যাপ্লিকেশনটিতে পড়তে পারি, যাতে আমি জেএসএনকে পার্স করতে পারি?

উত্তর:


145

ওপেনরোআর রিসোর্স দেখুন । এর মতো কিছু কাজ করা উচিত:

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();

4
আমি যদি স্ট্রিংটি অ্যান্ড্রয়েডের একটি স্ট্রিং রিসোর্সে রাখতে চাই এবং গেটআরসোর্সেস ()। GetString (আর। স্ট্রিং.নাম) ব্যবহার করে এটি গতিশীলভাবে ব্যবহার করতে চাই?
অঙ্কুর গৌতম

আমার জন্য এটি উদ্ধৃতিগুলির কারণে কাজ করে না, যা পড়ার সময় উপেক্ষা করা হয় এবং যেগুলি এড়ানো যায় না বলে মনে হয়
মেরিয়ান ক্লিস্প্পিজ

4
বাটারনিফ কে কাঁচা সংস্থান বাঁধানোর কোনও উপায় আছে কি ? মাত্র একটি স্ট্রিং পড়ার জন্য 10+ লাইন কোডের লেখা কিছুটা ওভারকিলের মতো মনে হচ্ছে।
জিজোর

কীভাবে জসসন সংস্থানসমূহের অভ্যন্তরে সংরক্ষণ করা হয়? কেবল \res\json_file.jsonফোল্ডারের ভিতরে বা ভিতরে \res\raw\json_file.json?
ক্লিফ বার্টন

4
এই উত্তরের সমালোচনামূলক তথ্য নেই। কোথায় getResources()বলা যেতে পারে? কাঁচা সম্পদ ফাইলটি কোথায় যাওয়া উচিত? বিল্ড টুলস তৈরির বিষয়টি নিশ্চিত করতে আপনার কোন সম্মেলন অনুসরণ করা উচিত R.raw.json_file?
8:48 এ 6'22 এ কেউ '

114

কোটলিন এখন অ্যান্ড্রয়েডের সরকারী ভাষা, তাই আমার ধারণা এটি কারও পক্ষে কার্যকর হবে

val text = resources.openRawResource(R.raw.your_text_file)
                                 .bufferedReader().use { it.readText() }

এটি একটি সম্ভাব্য দীর্ঘ চলমান অপারেশন, সুতরাং এটি নিশ্চিত করুন যে এটিকে মূল থ্রেডটি বলা হয়েছে!
অ্যান্ড্রু ওরোবেটর ই

4
@ অ্যান্ড্রু অরোবােটর আমি সন্দেহ করেছি যে কেউ অ্যাপের সংস্থানগুলিতে বড় জসন লাগিয়ে দেবে, তবে হ্যাঁ, চমৎকার বিষয়
ডিমা রোস্তোপিরা

24

রিসোর্স থেকে জিএসএন ব্যবহার করে কোনও জেএসওএন ফাইল থেকে লোড হওয়া কোনও বস্তু তৈরি করতে আমি @ কাবুকোর জবাবটি ব্যবহার করেছি :

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);
    }
}

এটি ব্যবহার করতে, আপনি নিম্নলিখিতগুলির মতো কিছু করতে চাই (উদাহরণটি একটিতে 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);
   }

4
নির্ভরতা যুক্ত করতে ভুলবেন না Don't আপনার গ্রেড ফাইলটিতে সংকলন com.google.code.gson: gson: 2.8.2 '
প্যাট্রিকরা

GSON শেষ সংস্করণimplementation 'com.google.code.gson:gson:2.8.5'
ড্যানিয়েল

13

Http://developer.android.com/guide/topics/resources/providing-resources.html থেকে :

কাঁচা /
সালিশী ফাইলগুলি তাদের কাঁচা ফর্মটিতে সংরক্ষণ করতে। কোনও কাঁচা ইনপুটস্ট্রিম দিয়ে এই সংস্থানগুলি খোলার জন্য, রিসোর্স.ওপেনআরউআরসোর্স () রিসোর্স আইডি সহ কল ​​করুন, এটি আর.আরও.ফাইলনাম।

তবে, আপনার যদি মূল ফাইলের নাম এবং ফাইলের ক্রমবিন্যাসের অ্যাক্সেসের প্রয়োজন হয় তবে আপনি সম্পদ / ডিরেক্টরিতে কিছু সংস্থান সংরক্ষণ করতে পারেন (রেজ / কাঁচা / পরিবর্তে)। সম্পদে থাকা ফাইলগুলিকে / কোনও সংস্থান আইডি দেওয়া হয় না, তাই আপনি কেবলমাত্র সম্পদ ম্যানেজার ব্যবহার করে সেগুলি পড়তে পারেন।


4
আমি যদি আমার অ্যাপ্লিকেশনটিতে একটি JSON ফাইল এম্বেড করতে চাই তবে আমি এটি কোথায় রাখব? সম্পদ ফোল্ডারে বা কাঁচা ফোল্ডারে? ধন্যবাদ!
রিকার্ডো

13

@ ম্যাম স্টেটসের মতো অ্যান্ড্রয়েড ডকুমেন্টেশন ( https://developer.android.com/guide/topics/resources/provider-res ્રો.html ) বলেছে যে / রিসোর্স (সংস্থানসমূহ) এর অধীনে / কাঁচা ডিরেক্টরিতে জেএসন ফাইলগুলি সংরক্ষণ করা যেতে পারে আপনার প্রকল্পের ডিরেক্টরি উদাহরণস্বরূপ:

MyProject/
  src/ 
    MyActivity.java
  res/
    drawable/ 
        graphic.png
    layout/ 
        main.xml
        info.xml
    mipmap/ 
        icon.png
    values/ 
        strings.xml
    raw/
        myjsonfile.json

এর ভিতরে Activity, জেসন ফাইলটি R(সংস্থানসমূহ) শ্রেণীর মাধ্যমে অ্যাক্সেস করা যায় এবং একটি স্ট্রিংয়ে পড়ে:

Context context = this;
Inputstream inputStream = context.getResources().openRawResource(R.raw.myjsonfile);
String jsonString = new Scanner(inputStream).useDelimiter("\\A").next();

এটি জাভা ক্লাস ব্যবহার করে Scanner, কোনও সাধারণ পাঠ্য / জেসন ফাইল পড়ার অন্যান্য পদ্ধতির তুলনায় কোডের কম লাইনগুলিতে নেতৃত্ব দেয়। ডিলিমিটার প্যাটার্নটির \Aঅর্থ ' ইনপুটটির সূচনা'। .next()পরবর্তী টোকেনটি পড়ে, যা এই ক্ষেত্রে পুরো ফাইল।

ফলাফলের জসন স্ট্রিংকে বিশ্লেষণের একাধিক উপায় রয়েছে:


4
এই গৃহীত উত্তর, মাত্র দুই লাইন এবং done.Thanks হওয়া উচিত
Ashana.Jackol

প্রয়োজনimport java.util.Scanner; import java.io.InputStream; import android.content.Context;
অ্যান্ড্রুহার্ভে

4
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");

1

ব্যবহার:

String json_string = readRawResource(R.raw.json)

কার্যাদি:

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

এই কোটলিন স্নিপেট উত্তরটি খুব সহায়ক Found Found পেয়েছে

মূল প্রশ্নটি একটি জেএসএন স্ট্রিং পেতে জিজ্ঞাসা করার সময়, আমি কেউ কেউ এটি দরকারী বলে মনে করি। Gsonসংশোধিত প্রকারের সাথে এই ছোট্ট ক্রিয়ায় বাড়ে আরও একটি পদক্ষেপ :

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

নোট আপনি যদি TypeTokenএটি T::classপড়েন তবেই আপনি এটি ব্যবহার করতে চান নাList<YourType> মুছে ফেলা টাইপ দ্বারা টাইপটি হারাবেন না।

প্রকারের অনুক্রমের সাহায্যে আপনি এর পরে এটি ব্যবহার করতে পারেন:

fun pricingData(): List<PricingData> = readRawJson(R.raw.mock_pricing_data)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.