简体   繁体   中英

How to Save "Data.Json" file from assets to internal Storage and then use it for read/write

Currently i am fetching a package details(Onnet Minutes, Offnet Minutes, etc) from a Json file " Data.json " from assets but i know we cannot change values from assets. So my Question is how to copy Data.json to internal storage and then Load it for read/Write.

I am using this to load Data.Json from Assets

    public String loadJSONFromAsset() {
    String json = null;
    try {
        InputStream is = getAssets().open("Data.json");
        int size = is.available();
        byte[] buffer = new byte[size];
        is.read(buffer);
        is.close();
        json = new String(buffer, "UTF-8");
        Toast.makeText(jazz_sim_lagao_offer_details.this, "JSON Loaded", Toast.LENGTH_SHORT).show();
    } catch (IOException ex) {
        ex.printStackTrace();
        return null;
    }
    return json;
}

and using this code to update data

    private void UpdateData() {
    JSONObject JSONobj = null;
    try {
        loadJSONFromAsset();
        //get JSONObject from JSON file
        JSONobj = new JSONObject(loadJSONFromAsset());
        //fetch JSONObject named
        JSONObject Jazz_SimLagaoOffer = JSONobj.getJSONObject("packages").getJSONObject("jazz_packages").getJSONObject("call_packages").getJSONObject("sim_lagao_offer");



        String Jazz_SimLagaoOffer_ONNET = Jazz_SimLagaoOffer.getString("onnet");
        Jazz_SimLagaoOffer_OnNet_TextView.setText(Jazz_SimLagaoOffer_ONNET);

        String Jazz_SimLagaoOffer_OFFNET = Jazz_SimLagaoOffer.getString("offnet");
        Jazz_SimLagaoOffer_OffNet_TextView.setText(Jazz_SimLagaoOffer_OFFNET);

        String Jazz_SimLagaoOffer_MBs = Jazz_SimLagaoOffer.getString("mbs");
        Jazz_SimLagaoOffer_Mb_TextView.setText(Jazz_SimLagaoOffer_MBs);

        String Jazz_SimLagaoOffer_SMS = Jazz_SimLagaoOffer.getString("sms");
        Jazz_SimLagaoOffer_Sms_TextView.setText(Jazz_SimLagaoOffer_SMS);


        String Jazz_SimLagaoOffer_SUBCODE = Jazz_SimLagaoOffer.getString("sub_code");
        Jazz_SimLagaoOffer_Sub_Code_TextView.setText(Jazz_SimLagaoOffer_SUBCODE);


        String Jazz_SimLagaoOffer_CHECKCODE = Jazz_SimLagaoOffer.getString("check_code");
        Jazz_SimLagaoOffer_Check_Code_TextView.setText(Jazz_SimLagaoOffer_CHECKCODE);

        String Jazz_SimLagaoOffer_UNSUBCODE = Jazz_SimLagaoOffer.getString("unsub_code");
        Jazz_SimLagaoOffer_Unsub_Code_TextView.setText(Jazz_SimLagaoOffer_UNSUBCODE);

        Jazz_SimLagaoOffer_Charges = Jazz_SimLagaoOffer.getString("charges");

    } catch (JSONException e) {
        e.printStackTrace();
        Toast.makeText(getBaseContext(), JSONobj + "", Toast.LENGTH_SHORT).show();
    }

}

How to Get Json Object?

Here is My Data.Json

 { "packages" : { "jazz_packages" : { "call_packages" : { "sim_lagao_offer" : { "charges" : "0.01", "check_code" : "*551*2#", "mbs" : "1500", "offnet" : "5000", "onnet" : "3000", "sms" : "3000", "sub_code" : "*551#", "unsub_code" : "*551*3#" } } } } }

Try this

private void CopyAssets() {
    AssetManager assetManager = getAssets();
    String[] files = null;



        System.out.println("File name => "+filename);
        InputStream in = null;
        OutputStream out = null;
        try {
            in = assetManager.open(YOUR_ASSETS_FILE);   // if files resides inside the "Files" directory itself
            out = new FileOutputStream(STORAGE_PATH).toString() +"/" + filename);
            copyFile(in, out);
            in.close();
            in = null;
            out.flush();
            out.close();
            out = null;
        } catch(Exception e) {
           e.printStackTrace();
        }

}
private void copyFile(InputStream in, OutputStream out) throws IOException {
    byte[] buffer = new byte[1024];
    int read;
    while((read = in.read(buffer)) != -1){
        out.write(buffer, 0, read);
    }
}

Use below code to read from storage

    String jsongString = readFromFile();
    JSONObject mainJsonObject = new JSONObject(jsongString);
    JSONObject Jazz_SimLagaoOffer = mainJsonObject.getJSONObject("packages").getJSONObject("jazz_packages").getJSONObject("call_packages").getJSONObject("sim_lagao_offer");

Use below method to read data from internal storage file and return as String.

private String readFromFile() {

String ret = "";
InputStream inputStream = null;
try {
    inputStream = openFileInput("names.json");

    if ( inputStream != null ) {
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
        String receiveString = "";
        StringBuilder stringBuilder = new StringBuilder();

        while ( (receiveString = bufferedReader.readLine()) != null ) {
            stringBuilder.append(receiveString);
        }

        ret = stringBuilder.toString();
    }
}
catch (FileNotFoundException e) {
    Log.e("login activity", "File not found: " + e.toString());
} catch (IOException e) {
    Log.e("login activity", "Can not read file: " + e.toString());
}
finally {
  try {
     inputStream.close();
  } catch (IOException e) {
    e.printStackTrace();
  }
}

return ret;

}

Hope this work :)

I Got Answer my own Question after 1 Day Research and Thanks to @pratik vekariya helped me a lot.

CopyAssets() works perfect as defined @pratik vekariya in his answer and to readfromfile see my Question loadJSONFromAssets() and i Just replaced line

InputStream is = getAssets().open("Data.json");

with this

InputStream is = new FileInputStream(getFilesDir().toString() +"/" + "Data.json");

to to load .json file from files and get json object from inputStrem

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM