Проверить, есть ли элемент в текстовом файле в формате JSON Android Studio - PullRequest
0 голосов
/ 21 июня 2020

Я пытаюсь проверить, существует ли config1 в текстовом файле, я использую библиотеку Google Gson.

Мой JSON файл:

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

Загрузка:

public void load() throws IOException {

        File file = getContext().getFileStreamPath("jsonfile.txt");
        
        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);
        componentURL= data.getMap().get("config1").get("component1");

Сохранение:

Gson gson = new Gson();
webViewActivity.Data data = gson.fromJson(json, webViewActivity.Data.class);

Map<String, String> configTest = data.getMap().get("config1");
        
data.getMap().get("config1").put(component, itemUrl);

String json = gson.toJson(data);

String filename = "jsonfile.txt";

FileOutputStream outputStream;

try {
   outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
   outputStream.write(json.getBytes());
   outputStream.close();
} catch (Exception 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;
        }

    }

Моя проблема в том, что мне нужно создать файл один раз, а затем проверить, существует ли файл , если это так, мне нужно проверить, существует ли config1, если нет, мне нужно поместить config1 в файл.

Но я не могу проверить, существует ли 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?

1 Ответ

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

Я думаю, вам следует изменить способ работы с вещами.

Сначала создайте POJO для Config1 каждого значения как:

// file Config1.java

public class Config1
{
    private String component1;

    private String component2;

    private String component3;

    public String getComponent1 ()
    {
        return component1;
    }

    public void setComponent1 (String component1)
    {
        this.component1 = component1;
    }

    public String getComponent2 ()
    {
        return component2;
    }

    public void setComponent2 (String component2)
    {
        this.component2 = component2;
    }

    public String getComponent3 ()
    {
        return component3;
    }

    public void setComponent3 (String component3)
    {
        this.component3 = component3;
    }

    @Override
    public String toString()
    {
        return "ClassPojo [component1 = "+component1+", component2 = "+component2+", component3 = "+component3+"]";
    }
}

А затем после этого POJO для Config2

// file Config2.java
public class Config2
{
    private String component1;

    private String component2;

    private String component3;

    public String getComponent1 ()
    {
        return component1;
    }

    public void setComponent1 (String component1)
    {
        this.component1 = component1;
    }

    public String getComponent2 ()
    {
        return component2;
    }

    public void setComponent2 (String component2)
    {
        this.component2 = component2;
    }

    public String getComponent3 ()
    {
        return component3;
    }

    public void setComponent3 (String component3)
    {
        this.component3 = component3;
    }

    @Override
    public String toString()
    {
        return "ClassPojo [component1 = "+component1+", component2 = "+component2+", component3 = "+component3+"]";
    }
}

И затем вам нужно POJO для Maps

// file Maps.java
public class Maps
{
    private Config2 config2;

    private Config1 config1;

    public Config2 getConfig2 ()
    {
        return config2;
    }

    public void setConfig2 (Config2 config2)
    {
        this.config2 = config2;
    }

    public Config1 getConfig1 ()
    {
        return config1;
    }

    public void setConfig1 (Config1 config1)
    {
        this.config1 = config1;
    }

    @Override
    public String toString()
    {
        return "ClassPojo [config2 = "+config2+", config1 = "+config1+"]";
    }
}

И, наконец, class, который завершит все MyJsonPojo. Хотя вы можете переименовать его как хотите.

// file MyJsonPojo.java
public class MyJsonPojo
{
    private Maps maps;

    public Maps getMaps ()
    {
        return maps;
    }

    public void setMaps (Maps maps)
    {
        this.maps = maps;
    }

    @Override
    public String toString()
    {
        return "ClassPojo [maps = "+maps+"]";
    }
}

Наконец, замените свой код в методе loadData() следующим образом:

public void load() throws IOException {

        File file = getContext().getFileStreamPath("jsonfile.txt");
        
        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, MyJsonPojo.class);

        Maps maps = data.getMaps();
        Config1 config1 = null;

        if (maps != null) {
            config1 = maps.getConfig1()
        }

        if (config1 != null) {
            componentURL = config1.getComponent1();
        }

}

Для сохранения значений вы можете сделать следующее:

public void save() {

    // set url here
    Component1 component1 = new Component1();
    component1.setComponent1(itemUrl);
    
    // store it in maps
    Maps maps = new Maps();
    maps.setComponent1(component1);

    // finally add it to the MyJsonPojo instance
    MyJsonPojo myJsonPojo = new MyJsonPojo();
    myJsonPojo.setMaps(maps);
    
    Gson gson = new Gson();
    String json = gson.toJson(maps);
    
    String filename = "jsonfile.txt";
    
    FileOutputStream outputStream;
    
    try {
       outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
       outputStream.write(json.getBytes());
       outputStream.close();
    } catch (Exception e) {
       e.printStackTrace();
    }
}

Обратите внимание, что вам, возможно, придется изменить код save() в соответствии с вашей структурой, потому что я совершенно не уверен, как вы обработали то, что в коде. Я предоставил базовую реализацию c без особых доказательств, читая свой код.

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