我想在手机的内部存储器中创建一个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?
谢谢你帮我!
4条答案
按热度按时间lrpiutwd1#
Google的Gson库在这种情况下会很有帮助。
1.在您的radle文件中添加Google Gson的依赖项。
1.为数据容器创建类
1.向类中添加数据
1.从数据类获取gson
1.现在可以将这个JSON保存在文本格式的文件中。
1.现在阅读时,将文本文件的内容加载到一个字符串中,例如'jsonString'。
1.将jsonString反序列化为Java对象
1.访问配置
1.添加新配置
1.再次按照以下步骤保存配置
1.或者,您可以手动编辑文本文件以根据预定义格式添加配置。
ebdffaop2#
下面是在单个JSON对象中创建多个对象的方法:
这将给予你想要的输出。同样,如果你想把任何对象变成数组,你可以使用
JSONArray
。nimxete23#
请考虑使用https://github.com/google/gson。您将使用类示例而不是JSONObject。方便得多。
只是为了让你知道你能做什么:
上面的打印:
你可以在json字符串和实体本身之间后退和强制,要编辑,你只需要使用object-自然和方便的方式。
xeufq47z4#
根据需要编辑JSON数据。例如,可以使用以下代码将“age”字段的值更改为40:
使用以下代码将修改后的JSONObject转换回JSON字符串:
使用以下代码将更新后的JSON数据写回文件:
输出流编写器。写入(更新的Json);关闭();