如何在现有的结构GSON一个JSON插入一个多项目? [英] How to insert one more item in a json existing structure with gson?
本文介绍了如何在现有的结构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!
主要类
私有静态文件fileJson =新的文件(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屋!
查看全文