【问题标题】:read and write data with GSON使用 GSON 读写数据
【发布时间】:2013-10-18 21:07:42
【问题描述】:

我正在努力寻找一个关于如何使用 GSON 在我的 android 应用中读取和写入数据的好例子。有人可以告诉我或指出一个很好的例子吗?我将其用于活动之间的数据持久性。

我的教授举了这个例子来写作:

Vector v = new Vector(10.0f, 20.0f);
Gson gson = new Gson();
String s = gson.toJson(v);

我将如何将其保存到文件中?

【问题讨论】:

  • 这似乎不是 Gson 的问题,看来您正在寻找有关在 Android 设备上创建文件的信息...
  • @RayStojonic 我从来没有说过这是个问题。我找不到任何关于如何使用它的好信息。
  • @trapo 在该文档中没有提到GSON
  • 是的,但是一旦有了 's' 字符串,只需将其保存,就像将“Hello world”字符串保存到示例中一样。

标签: java android gson


【解决方案1】:

如何将您的 JSON 保存到内部存储的文件中:

String filename = "myfile.txt";

Vector v = new Vector(10.0f, 20.0f);
Gson gson = new Gson();
String s = gson.toJson(v);

FileOutputStream outputStream;

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

如何回读:

 FileInputStream fis = context.openFileInput("myfile.txt", Context.MODE_PRIVATE);
 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();
 Vector v = gson.fromJson(json, Vector.class);

【讨论】:

  • openFileInput 只接受一个需要为字符串的参数。
  • 上下文是什么?
【解决方案2】:

简单的 Gson 示例:

public class Main {

    public class Power {
        private String name;
        private Long damage;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public Long getDamage() {
            return damage;
        }

        public void setDamage(Long damage) {
            this.damage = damage;
        }

        public Power() {
            super();
        }

        public Power(String name, Long damage) {
            super();
            this.name = name;
            this.damage = damage;
        }

        @Override
        public String toString() {
            return "Power [name=" + name + ", damage=" + damage + "]";
        }

    }

    public class Warrior {
        private String name;
        private Power power;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public Power getPower() {
            return power;
        }

        public void setPower(Power power) {
            this.power = power;
        }

        public Warrior() {
            super();
        }

        public Warrior(String name, Power power) {
            super();
            this.name = name;
            this.power = power;
        }

        @Override
        public String toString() {
            return "Warrior [name=" + name + ", power=" + power.toString() + "]";
        }

    }

    public static void main(String[] args) {
        Main m = new Main();
        m.run();
    }

    private void run() {
        Warrior jake = new Warrior("Jake the dog", new Power("Rubber hand", 123l));
        String jsonJake = new Gson().toJson(jake);
        System.out.println("Json:"+jsonJake);
        Warrior returnToWarrior = new Gson().fromJson(jsonJake, Warrior.class);
        System.out.println("Object:"+returnToWarrior.toString());
    }

}

无论如何,请查看documentation

要在应用程序中保留某些内容,您可以从 ORMlite 之类的简单内容开始。

希望对您有所帮助! :]

更新:

如果你真的想将 json 写入文件:

        File myFile = new File("/sdcard/myjsonstuff.txt");
        myFile.createNewFile();
        FileOutputStream fOut = new FileOutputStream(myFile);
        OutputStreamWriter myOutWriter =new OutputStreamWriter(fOut);
        myOutWriter.append(myJsonString);
        myOutWriter.close();
        fOut.close();

如果你想阅读:

        File myFile = new File("/sdcard/myjsonstuff.txt");
        FileInputStream fIn = new FileInputStream(myFile);
        BufferedReader myReader = new BufferedReader(new InputStreamReader(fIn));
        String aDataRow = "";
        String aBuffer = ""; //Holds the text
        while ((aDataRow = myReader.readLine()) != null) 
        {
            aBuffer += aDataRow ;
        }
        myReader.close();

另加:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 到你的清单。

但是,说真的,使用 ORM 并将记录存储在数据库中要好得多。我不知道你为什么需要将json数据保存在一个文件中,但如果我是你,我会使用ORM方式。

【讨论】:

  • 感谢您的示例。我将如何将这些 json 写入文件?
【解决方案3】:

也许在更新的版本中,但 toJson 接受直接写入文件的写入器。

例如:

Vector v = new Vector(10.0f, 20.0f);
Gson gson = new GsonBuilder().create(); 
Writer writerJ = new FileWriter("keep.json");
gson.toJson(v,writerJ);

【讨论】:

    【解决方案4】:

    使用

    将您的课程保存在 SharedPrefrences 中
    public static void saveYourClassInSharedPref(ClassToSave ClassToSave) {
            try{
                String json = "";
                if(ClassToSave != null){
                    json = new Gson().toJson(ClassToSave);
                }
                SharedPref.save(KeysSharedPrefs.ClassToSave, json);
            }catch (Exception ex){
                ex.printStackTrace();
            }
    
        }
    
        public static ClassToSave readYourClassFromSharedPref() {
            ClassToSave ClassToSave;
            try{
                String json = SharedPref.read(KeysSharedPrefs.ClassToSave, "");
                if(!json.isEmpty()){
                    ClassToSave = new Gson().fromJson(json, ClassToSave.class);
                    return ClassToSave;
                }
            }catch (Exception ex){
                ex.printStackTrace();
            }
            return null;
        }
    

    在哪里SharedPref.java

    public class SharedPref {
    
        public static String read(String valueKey, String valueDefault) {
            SharedPreferences prefs = PreferenceManager
                    .getDefaultSharedPreferences(App.context);
            return prefs.getString(valueKey, valueDefault);
        }
    
        public static void save(String valueKey, String value) {
            SharedPreferences prefs = PreferenceManager
                    .getDefaultSharedPreferences(App.context);
            SharedPreferences.Editor edit = prefs.edit();
            edit.putString(valueKey, value);
            edit.commit();
        }
    }
    

    【讨论】:

      【解决方案5】:

      您也可以完全使用流来完成此操作并避免使用中间对象:

      Vector v;
      
      // This should be reused, so private static final
      Gson gson = new GsonBuilder().create();
      
      // Read from file:
      try (InputStream fileIn = context.openFileInput("myfile.txt", Context.MODE_PRIVATE);
           BufferedInputStream bufferedIn = new BufferedInputStream(fileIn, 65536);
           Reader reader = new InputStreamReader(bufferedIn, StandardCharsets.UTF_8)) {
          gson.fromJson(reader, Vector.class);
      }
      
      v = new Vector(10.0f, 20.0f);
      
      // Write to file
      try (OutputStream fileOut = context.openFileOutput(filename, Context.MODE_PRIVATE);
           OutputStream bufferedOut = new BufferedOutputStream(fileOut, 65536);
           Writer writer = new OutputStreamWriter(bufferedOut)) {
          gson.toJson(v, writer);
      }
      

      Choose buffer sizes appropriately. 64k 对闪存友好,但如果你只有 1k 的数据就很傻。某些版本的 Android 也可能不支持 try-with-resources。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-05
        • 2012-12-29
        • 2022-01-23
        • 2020-06-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多