如何在现有的结构GSON一个JSON插入一个多项目? [英] How to insert one more item in a json existing structure with gson?

查看:258
本文介绍了如何在现有的结构GSON一个JSON插入一个多项目?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

下code产生正确的JSON文件的第一个结构。

  GSON =新GsonBuilder()设定prettyPrinting()创建()。AudDetHeader AudDetHeader =新AudDetHeader();// ArrayList的<&的OrderDetail GT; AudDetList =新的ArrayList<&的OrderDetail GT;();
地图<弦乐,AudDet> AudDetList =新的HashMap<弦乐,AudDet>();AudDet AudDet =新AudDet();
AudDet.setLineId(1);
AudDet.setItemNumber(ABC);
AudDet.setQuantity(9);
AudDet.setPrice(10.00);清单<串GT;手机=新的ArrayList<串GT;();
phones.add(24530001);
phones.add(24530002);
phones.add(24530003);
AudDet.setPhones(电话);AudDetList.put(睾丸2,AudDet);
AudDetHeader.setAudDetList(AudDetList);。GSON GSON =新GsonBuilder()设定prettyPrinting()创建()。
字符串jsonString = gson.toJson(AudDetHeader);BufferedWriter将BufferedWriter将= NULL;
尝试{    档案文件=新的文件(Environment.getExternalStorageDirectory()+/download/test/test.json);
    如果(!file.exists()){
        file.createNewFile();
    }    FileWriter的FileWriter的=新的FileWriter(文件);
    BufferedWriter将=新的BufferedWriter(的FileWriter);
    bufferedWriter.write(jsonString);
}赶上(IOException异常五){
    e.printStackTrace();
} {最后
    尝试{
        如果(BufferedWriter将!= NULL){
            bufferedWriter.close();
        }
    }赶上(IOException异常前){
        ex.printStackTrace();
    }
}

在code的结果是:

  {
  结果:{
    睾丸2:{
      itemNumber:ABC,
      另一LineID:1,
      手机:
        24530001,
        24530002,
        24530003
      ]
      价格:10.0,
      量:9
    }
  }
}

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

  {
   结果:{
      睾丸2:{
         itemNumber:ABC,
         另一LineID:1,
         手机:
            24530001,
            24530002,
            24530003
         ]
         价格:10.0,
         量:9
      },
      睾丸3:{
         itemNumber:DEF
         另一LineID:2,
         手机:
            30303030,
            40404040,
            505050
         ]
         价格:11.0,
         量:12
      }
   }
}

该AudDetHeader.class

 公共类AuditoriaDetalheHeader {@SerializedName(结果)
私人地图<弦乐,AuditoriaDetalhe> AuditoriaDetalheList;
    ...
}

该AudDet.class

 公共类AuditoriaDetalhe { 字符串另一LineID = NULL;
 字符串itemNumber = NULL;
 INT数量= 0;
 双价= NULL;
 清单<串GT;手机=新的ArrayList<串GT;();
     ...
}


解决方案

为我工作与此code!

主要类

 私有静态文件fil​​eJson =新的文件(Environment.getExternalStorageDirectory()+/download/test/test.json);@覆盖
公共无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.teste_criajson);createJsonStructure();按钮btnSave =(按钮)findViewById(R.id.btSave);btnSalvar.setOnClickListener(新View.OnClickListener(){
    公共无效的onClick(视图v){        尝试{
            串strFileJson = getStringFromFile(fileJson.toString());
            JSONObject的jsonObj =新的JSONObject(strFileJson);
            GSON GSON =新GSON();
            JsonParser jsonParser =新JsonParser();
            串idAud =10;            AudDet广告=新AudDet();
            ad.setLineId(2);
            ad.setItemNumber(DEF);
            ad.setQuantity(22);
            ad.setPrice(22.22);            清单<串GT;手机=新的ArrayList<串GT;();
            phones.add(22);
            phones.add(22);
            phones.add(22);
            ad.setPhones(电话);            字符串jsonStr = jsonParser.parse(gson.toJson(AD))的toString()。
            的JSONObject的JSONObject =新的JSONObject(jsonStr);
            jsonObj.getJSONObject(结果)放(idAud,JSONObject的)。            writeJsonFile(fileJson,jsonObj.toString());        }赶上(例外E1){
            e1.printStackTrace();
        }
    }
});

如果不存在JSON文件,然后我与插入itens基本结构创建。

 公共静态无效createJsonStructure(){
    如果(!fileJson.exists()){
        尝试{
            fileJson.createNewFile();            字符串jsonString ={\\结果\\:{}};            writeJsonFile(fileJson,jsonString);        }赶上(IOException异常五){
            e.printStackTrace();
        }
    }
}

打开JSON文件,以获得字符串格式,和prepare插入一个新的项目:

 公共静态字符串getStringFromFile(字符串文件路径)抛出异常{
    文件F1 =新的文件(文件路径);
    的FileInputStream鳍=新的FileInputStream(佛罗里达州);
    字符串RET = convertStreamToString(翅);
    //确保关闭所有流。
    fin.close();
    返回RET;
}
公共静态字符串convertStreamToString(InputStream为)抛出异常{
    读者的BufferedReader =新的BufferedReader(新的InputStreamReader(是));
    StringBuilder的SB =新的StringBuilder();
    串线= NULL;
    而((行= reader.readLine())!= NULL){
      sb.append(线).append(\\ n);
    }
    返回sb.toString();
}

写入已存在的JSON文件:

 公共静态无效writeJsonFile(文件文件,字符串JSON)
{
    BufferedWriter将BufferedWriter将= NULL;
    尝试{        如果(!file.exists()){
            file.createNewFile();
        }        FileWriter的FileWriter的=新的FileWriter(文件);
        BufferedWriter将=新的BufferedWriter(的FileWriter);
        bufferedWriter.write(JSON);    }赶上(IOException异常五){
        e.printStackTrace();
    } {最后
        尝试{
            如果(BufferedWriter将!= NULL){
                bufferedWriter.close();
            }
        }赶上(IOException异常前){
            ex.printStackTrace();
        }
    }
}

The code below generates correctly the first structure of the json file.

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

The result of the code:

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

I want to add a new item. My desire is to stay as the structure below.

{
   "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
      }
   }
}

The AudDetHeader.class

public class AuditoriaDetalheHeader {

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

The AudDet.class

public class AuditoriaDetalhe {

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

解决方案

Worked for me with this code!!!

Main class

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


    }
});

If do not exists json file, then i create with basic structure for insert the itens.

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

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

            writeJsonFile(fileJson, jsonString);                

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

Open the json file to get the string format, and prepare to insert a new item:

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

Writes into the json file that already exists:

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

这篇关于如何在现有的结构GSON一个JSON插入一个多项目?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆