簡體   English   中英

在 Android Studio 中創建、寫入、編輯 JSON 文件

[英]Create, Write, Edit JSON file in Android Studio

我想在手機的內部存儲器中創建一個 JSON 文件,用於存儲數據。 我希望能夠將對象(“configX”)添加到文件中,然后讀取數據。

它應該看起來像這樣:

{

  "config1": {

    "component1": "url",
    "component2": "url",
    "component3": "url"

  },

  "config2": {

    "component1": "url",
    "component2": "url",
    "component3": "url"

  }

}

我可以像這樣創建一個 JSON 文件:

public void saveToJson(){
    JSONObject json = new JSONObject();
    try {
        json.put("component1", "url");
        json.put("component2", "url");

        String jsonString = json.toString();
        
        FileOutputStream fos = this.openFileOutput("jsonfile", Context.MODE_PRIVATE);
        fos.write(jsonString.getBytes());
        fos.close();

        Log.d("JSON" , json.toString());

    } catch (IOException | JSONException e) {
        e.printStackTrace();
    }
}

但是如何將組件放入配置 object 中? 以及如何檢索數據?

編輯1:

https://stackoverflow.com/a/62474912/11652860

感謝您提供非常詳細的答案,我做錯了。 我有一個活動,我將數據放入並保存到 json 文件中:

public class Data {

        private Map<String, Map<String, String>> map;

        public Data() {

        }

        public Data(Map<String, Map<String, String>> map) {
            this.map = map;
        }

        public Map<String, Map<String, String>> getMap() {
            return map;
        }

        public void setMap(Map<String, Map<String, String>> map) {
            this.map = map;
        }

    }
Map<String, String> config1 = new HashMap<>();
config1.put("component1", "url1");
config1.put("component2", "url1");
config1.put("component3", "url1");

Map<String, Map<String, String>> map = new HashMap<>();
map.put("config1", config1);

Data data = new Data(map);

Gson gson = new Gson();
String json = gson.toJson(data);

FileOutputStream fos = null;
 try {
fos = webViewActivity.this.openFileOutput("jsonfile", Context.MODE_PRIVATE);
} catch (FileNotFoundException e) {
 e.printStackTrace();
}
 try {
 fos.write(json.getBytes());
} catch (IOException e) {
  e.printStackTrace();
}
 try {
 fos.close();
} catch (IOException e) {
 e.printStackTrace();
}

還有一個我加載數據的片段:

public class Data {

        private Map<String, Map<String, String>> map;

        public Data() {

        }

        public Data(Map<String, Map<String, String>> map) {
            this.map = map;
        }

        public Map<String, Map<String, String>> getMap() {
            return map;
        }

        public void setMap(Map<String, Map<String, String>> map) {
            this.map = map;
        }

    }
 public void load(){
        FileInputStream fis = null;

        try {

            fis = getContext().openFileInput("jsonfile.txt");
            InputStreamReader isr = new InputStreamReader(fis);
            BufferedReader br = new BufferedReader(isr);

            StringBuilder sb = new StringBuilder();
            String text;

            while ((text = br.readLine()) != null){
                sb.append(text).append("\n");

                Gson gson = new Gson();

                String json = gson.toJson(text);
                Data data = gson.fromJson(json, Data.class);

                String url = data.getMap().get("config1").get("component1");

                frameTV.setText(url);

            }


        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fis != null){
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

保存和加載部分一定是錯誤的,但它們可以從文本文件中獲取文本

編輯2:

我發現了問題,我沒有正確加載和保存:

保存:

String filename = "jsonfile.txt";

FileOutputStream outputStream;

try {
   outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
   outputStream.write(json.getBytes());
   outputStream.close();
} catch (Exception e) {
   e.printStackTrace();
}

加載:

FileInputStream fis = getContext().openFileInput("jsonfile.txt");
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader bufferedReader = new BufferedReader(isr);
StringBuilder sb = new StringBuilder();
String line;
while ((line = bufferedReader.readLine()) != null) {
    sb.append(line);
}

String json = sb.toString();

Gson gson = new Gson();
Data data = gson.fromJson(json, Data.class);
String priceURL = data.getMap().get("config1").get("url1");

編輯 3:

我現在的問題是我需要創建一次文件,然后檢查文件是否存在,如果存在,我需要檢查 config1 是否存在,如果不存在,我需要將 config 放入文件中。

But I can't check if config1 exists because I get: java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.Map com.a.app.ui.app.appFragment$Data.getMap()

我通過以下方式檢查它是否存在:

Boolean configTest = data.getMap().containsKey("config1");
if(!configTest){}

如何在不出現 NullPointerException 的情況下創建文件並檢查數據?

感謝你們對我的幫助 !

Google 的 Gson 庫在這種情況下會有所幫助。

  1. 在您的 radle 文件中添加對 Google Gson 的依賴項。
    dependencies {
      implementation 'com.google.code.gson:gson:2.8.6'
    }
  1. 為您的數據容器創建 class
    public class Data {

        private Map<String, Map<String, String>> map;

        public Data() {
        }

        public Data(Map<String, Map<String, String>> map) {
            this.map = map;
        }

        public Map<String, Map<String, String>> getMap() {
            return map;
        }

        public void setMap(Map<String, Map<String, String>> map) {
            this.map = map;
        }
    }
  1. 將數據添加到 class
    Map<String, String> config1 = new HashMap<>();
    config1.put("component1", "url1");
    config1.put("component2", "url1");
    config1.put("component3", "url1");

    Map<String, String> config2 = new HashMap<>();
    config2.put("component1", "url1");
    config2.put("component2", "url1");
    config2.put("component3", "url1");

    Map<String, Map<String, String>> map = new HashMap<>();
    map.put("config1", config1);
    map.put("config2", config2);

    Data data = new Data(map);
  1. 從數據 class 中獲取 gson
Gson gson = new Gson();
String json = gson.toJson(data);
  1. 您現在可以將此 json 保存在文本格式的文件中。

  2. 現在在閱讀時,將文本文件的內容加載到一個字符串中,比如“jsonString”。

  3. 將jsonString反序列化為Java Object

Data data = gson.fromJson(json, Data.class);
  1. 訪問配置
String url = data.getMap().get("config1").get("component1");
  1. 添加新配置
    Map<String, String> config3 = new HashMap<>();
    config3.put("component1", "url1");
    config3.put("component2", "url1");
    config3.put("component3", "url1");

    data.getMap().put("config3", config3);

  1. 再次按照這些步驟保存配置

  2. 或者您可以手動編輯文本文件以根據預定義的格式添加配置。

    {
       "maps":{
          "config2":{
             "component1":"url1",
             "component2":"url1",
             "component3":"url1"
          },
          "config1":{
             "component1":"url1",
             "component2":"url1",
             "component3":"url1"
          }
       }
    }

請考慮使用https://github.com/google/gson 您將使用 class 實例而不是 JSONObject。 方便很多。

只是為了讓您了解您可以做什么:

public class TestClass {
    private final Map<String, String> config1;
    private final Map<String, String> config2;

    public TestClass(Map<String, String> config1, Map<String, String> config2) {
        this.config1 = config1;
        this.config2 = config2;
    }
}

        Gson gson = new GsonBuilder().setPrettyPrinting().create();

        Map<String, String> config1 = new HashMap<String, String>();
        config1.put("hello1.1", "world1.1");
        config1.put("hello1.2", "world1.2");

        Map<String, String> config2 = new HashMap<String, String>();
        config2.put("hello2.1", "world2.1");
        config2.put("hello2.2", "world2.2");

        TestClass testClass = new TestClass(config1, config2);

        Log.d("zzz", gson.toJson(testClass));

以上打印:

    {
      "config1": {
        "hello1.1": "world1.1",
        "hello1.2": "world1.2"
      },
      "config2": {
        "hello2.1": "world2.1",
        "hello2.2": "world2.2"
      }
    }

您可以返回 go 並在 json 字符串和實體本身之間強制。 要進行編輯,您只需要使用 object - 自然便捷的方式。

這是在單個 JSON object 中創建多個對象的方式:

//Creating first Object
JSONObject config1 = new JSONObject();
try {
    json.put("component1", "url");
    json.put("component2", "url");
    json.put("component2", "url");
    }
catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

//Creating second object
JSONObject config2 = new JSONObject();
try {
    json.put("component1", "url");
    json.put("component2", "url");
    json.put("component2", "url");
    }
catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

JSONObject finalJSON = new JSONObject();
try {
    //Adding both objects in one single object
    json.put("config1", config1);
    json.put("config2", config2);

    String jsonString = finalJSON.toString();

    FileOutputStream fos = this.openFileOutput("jsonfile", Context.MODE_PRIVATE);
    fos.write(jsonString.getBytes());
    fos.close();

    Log.d("JSON" , json.toString());

} catch (IOException | JSONException e) {
    e.printStackTrace();
}

這將為您提供所需的 output。 此外,如果您想將任何 object 設為數組,則可以使用JSONArray

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM