Создание, запись, редактирование JSON файла в Android Studio - PullRequest
0 голосов
/ 19 июня 2020

Я хочу создать файл 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();
    }
}

Но как поместить компоненты в объект конфигурации? А как получить данные?

EDIT 1:

{ ссылка }

Спасибо за очень подробный ответ, Я что-то не так делаю. У меня есть 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;
        }

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

Части сохранения и загрузки должны быть неправильными, но они работали для получения текста из текстового файла

EDIT 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 ?

Спасибо, что помогли мне!

Ответы [ 3 ]

1 голос
/ 19 июня 2020

Вот как вы создаете несколько объектов в одном 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.

1 голос
/ 19 июня 2020

Библиотека Google Gson будет полезна в этом случае.

  1. Добавьте зависимость для Google Gson в свой файл radle.
    dependencies {
      implementation 'com.google.code.gson:gson:2.8.6'
    }
Создайте класс для вашего контейнера данных
    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, 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);
Получить gson из класса данных
Gson gson = new Gson();
String json = gson.toJson(data);

Теперь вы можете сохранить это json в файле в текстовом формате.

Теперь при чтении загрузите содержимое текстового файла в строку, скажем ' jsonString '.

Десериализовать jsonString в Java Object

Data data = gson.fromJson(json, Data.class);
Конфигурации доступа
String url = data.getMap().get("config1").get("component1");
Добавить новые конфигурации
    Map<String, String> config3 = new HashMap<>();
    config3.put("component1", "url1");
    config3.put("component2", "url1");
    config3.put("component3", "url1");

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

Повторите следующие шаги, чтобы сохранить конфигурации

Или вы можете вручную отредактировать текстовый файл, чтобы добавить конфигурации в соответствии с предопределенным форматом.

    {
       "maps":{
          "config2":{
             "component1":"url1",
             "component2":"url1",
             "component3":"url1"
          },
          "config1":{
             "component1":"url1",
             "component2":"url1",
             "component3":"url1"
          }
       }
    }
1 голос
/ 19 июня 2020

Пожалуйста, подумайте об использовании 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"
      }
    }

Вы можете go назад и между json строкой и самой сущностью. Для редактирования достаточно работать с объектом - естественный и удобный способ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...