android - 如何使用 gson 在 json 现有结构中再插入一项?

标签 android json gson

下面的代码正确生成json文件的第一个结构。

gson = new GsonBuilder().setPrettyPrinting().create();

AudDetHeader AudDetHeader = new AudDetHeader();

//ArrayList<OrderDetail> AudDetList = new ArrayList<OrderDetail>();
Map<String, AudDet> AudDetList = new HashMap<String, AudDet>();

AudDet AudDet = new AudDet();
AudDet.setLineId("1");
AudDet.setItemNumber("ABC");
AudDet.setQuantity(9);
AudDet.setPrice(10.00);

List<String> phones = new ArrayList<String>();                   
phones.add("24530001");
phones.add("24530002");
phones.add("24530003");             
AudDet.setPhones(phones);               

AudDetList.put("teste 2", AudDet);              
AudDetHeader.setAudDetList(AudDetList);

Gson gson = new GsonBuilder().setPrettyPrinting().create();
String jsonString = gson.toJson(AudDetHeader);

BufferedWriter bufferedWriter = null;
try {

    File file = new File(Environment.getExternalStorageDirectory() + "/download/test/test.json");
    if(!file.exists()){
        file.createNewFile();
    }

    FileWriter fileWriter = new FileWriter(file);
    bufferedWriter = new BufferedWriter(fileWriter);
    bufferedWriter.write(jsonString);


} catch (IOException e) {
    e.printStackTrace();
} finally {
    try {
        if (bufferedWriter != null){
            bufferedWriter.close();
        }
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

代码的结果:

{
  "Results": {
    "teste 2": {
      "itemNumber": "ABC",
      "lineId": "1",
      "phones": [
        "24530001",
        "24530002",
        "24530003"
      ],
      "price": 10.0,
      "quantity": 9
    }
  }
}

我想添加一个新项目。我的愿望是保持下面的结构。

{
   "Results":{
      "teste 2":{
         "itemNumber":"ABC",
         "lineId":"1",
         "phones":[
            "24530001",
            "24530002",
            "24530003"
         ],
         "price":10.0,
         "quantity":9
      },
      "teste 3":{
         "itemNumber":"DEF",
         "lineId":"2",
         "phones":[
            "30303030",
            "40404040",
            "505050"
         ],
         "price":11.0,
         "quantity":12
      }
   }
}

AudDetHeader.class

public class AuditoriaDetalheHeader {

@SerializedName("Results")
private Map<String, AuditoriaDetalhe> AuditoriaDetalheList;
    ...
}

AudDet.class

public class AuditoriaDetalhe {

 String lineId = null;
 String itemNumber = null;
 int quantity = 0;
 Double price = null;
 List<String> phones = new ArrayList<String>();
     ...
}

最佳答案

用这段代码为我工作!!!

主类

private static File fileJson = new File(Environment.getExternalStorageDirectory() + "/download/test/test.json");

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.teste_criajson);

createJsonStructure();

Button btnSave = (Button)findViewById(R.id.btSave);

btnSalvar.setOnClickListener( new View.OnClickListener() {
    public void onClick(View v) {

        try {
            String strFileJson = getStringFromFile(fileJson.toString());            
            JSONObject jsonObj = new JSONObject(strFileJson);
            Gson gson = new Gson();
            JsonParser jsonParser = new JsonParser();
            String idAud = "10";

            AudDet ad = new AudDet();
            ad.setLineId("2");
            ad.setItemNumber("DEF");
            ad.setQuantity(22);
            ad.setPrice(22.22);

            List<String> phones = new ArrayList<String>();                   
            phones.add("22");
            phones.add("22");
            phones.add("22");               
            ad.setPhones(phones);       

            String jsonStr = jsonParser.parse(gson.toJson(ad)).toString();
            JSONObject JSONObject = new JSONObject(jsonStr);
            jsonObj.getJSONObject("Results").put(idAud, JSONObject);

            writeJsonFile(fileJson, jsonObj.toString());

        } catch (Exception e1) {
            e1.printStackTrace();
        }


    }
});

如果不存在 json 文件,那么我将创建用于插入 itens 的基本结构。

public static void createJsonStructure(){
    if(!fileJson.exists()){         
        try {
            fileJson.createNewFile();

            String jsonString = "{\"Results\":{}}";

            writeJsonFile(fileJson, jsonString);                

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

打开json文件获取字符串格式,准备插入新项:

public static String getStringFromFile (String filePath) throws Exception {
    File fl = new File(filePath);
    FileInputStream fin = new FileInputStream(fl);
    String ret = convertStreamToString(fin);
    //Make sure you close all streams.
    fin.close();        
    return ret;
}
public static String convertStreamToString(InputStream is) throws Exception {
    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    StringBuilder sb = new StringBuilder();
    String line = null;
    while ((line = reader.readLine()) != null) {
      sb.append(line).append("\n");
    }
    return sb.toString();
}

写入已存在的json文件:

public static void writeJsonFile(File file, String json) 
{
    BufferedWriter bufferedWriter = null;
    try {

        if(!file.exists()){
            file.createNewFile();
        }

        FileWriter fileWriter = new FileWriter(file);
        bufferedWriter = new BufferedWriter(fileWriter);
        bufferedWriter.write(json);

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (bufferedWriter != null){
                bufferedWriter.close();
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

关于android - 如何使用 gson 在 json 现有结构中再插入一项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16677728/

相关文章:

android - 是否有像 Cocoa Controls 这样的 Android 存储库?

java - 在库项目内的 Activity 中使用 Android 通用图像加载器

java - RecyclerView 带过滤器列表的可点击对象

python - 使用 pandas.io.json.json_normalize 获取 "AttributeError: ' float' 对象没有属性 'items'“

java - 使用 Java 有条件地访问同一级别的 JsonElements

java - 您在哪里/如何使用 Android 注释?

java - Gson:预期为 begin_array,但为 STRING 如何控制它

javascript - PHP 解析 PDO Fetch 为 JSON

java - 来自 Bukkit 插件的 Retrofit API 调用失败(IllegalAccessException)

android - GSON 忽略 JSON 字符串中的缺失值