在Android Studio中创建、编写、编辑JSON文件

vpfxa7rd  于 2023-03-03  发布在  Android
关注(0)|答案(4)|浏览(419)

我想在手机的内部存储器中创建一个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();
    }
}

但是如何将组件放入配置对象中?以及如何检索数据?

    • 编辑1:**

https://stackoverflow.com/a/62474912/11652860
感谢您的详细回答,我做错了一些事情。我有一个Activity,我在其中放置并保存数据到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;
        }

    }
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放入文件中。
但我无法检查config1是否存在,因为我得到: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?
谢谢你帮我!

lrpiutwd

lrpiutwd1#

Google的Gson库在这种情况下会很有帮助。
1.在您的radle文件中添加Google Gson的依赖项。

dependencies {
      implementation 'com.google.code.gson:gson:2.8.6'
    }

1.为数据容器创建类

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.向类中添加数据

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.从数据类获取gson

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

1.现在可以将这个JSON保存在文本格式的文件中。
1.现在阅读时,将文本文件的内容加载到一个字符串中,例如'jsonString'。
1.将jsonString反序列化为Java对象

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.再次按照以下步骤保存配置
1.或者,您可以手动编辑文本文件以根据预定义格式添加配置。

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

ebdffaop2#

下面是在单个JSON对象中创建多个对象的方法:

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

这将给予你想要的输出。同样,如果你想把任何对象变成数组,你可以使用JSONArray

nimxete2

nimxete23#

请考虑使用https://github.com/google/gson。您将使用类示例而不是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"
      }
    }

你可以在json字符串和实体本身之间后退和强制,要编辑,你只需要使用object-自然和方便的方式。

xeufq47z

xeufq47z4#

**Edit JSON file in android programmatically**

sample JSON file (data.json):

    {
    "name": "John Smith",
    "age": 35,
    "city": "New York"
}

In your Android activity, read the contents of the JSON file using the following code:

    InputStream is = getAssets().open("data.json");
int size = is.available();
byte[] buffer = new byte[size];
is.read(buffer);
is.close();
String json = new String(buffer, "UTF-8");

  Parse the JSON data using the following code:
JSONObject obj = new JSONObject(json);

根据需要编辑JSON数据。例如,可以使用以下代码将“age”字段的值更改为40:

obj.put("age", 40);

使用以下代码将修改后的JSONObject转换回JSON字符串:

String updatedJson = obj.toString();

使用以下代码将更新后的JSON数据写回文件:

OutputStreamWriter outputStreamWriter = new OutputStreamWriter(openFileOutput("data.json", Context.MODE_PRIVATE));

输出流编写器。写入(更新的Json);关闭();

相关问题