我有这个由我的应用程序生成的结构,我在listView中读取:
[{
"phone": "202020",
"name": "Jhon",
"id": 10,
"age": 20
},
{
"phone": "303030",
"name": "Rose",
"id": 11,
"age": 22
}]
当我在列表视图中选择一个项目时,我会打开一个传递所点击项目值的屏幕表格。
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// getting values from selected ListItem
String name = ((TextView) view.findViewById(R.id.name)).getText().toString();
String age = ((TextView) view.findViewById(R.id.age)).getText().toString();
String phone = ((TextView) view.findViewById(R.id.phone)).getText().toString();
// Starting new intent
Intent in = new Intent(getApplicationContext(), SingleMenuItemActivity.class);
in.putExtra(TAG_NAME, name);
in.putExtra(TAG_AGGE, age);
in.putExtra(TAG_PHONE, phone);
startActivity(in);
}
});
当您单击该项目时,此屏幕会打开,我将表单放在前面屏幕字段中传递的值。
我的问题是:当您在此表单中单击“保存”时,我必须获取新值并更新json文件。怎么做?
例如:我想更改记录ID 22,即用户Rose。
添加更多信息:
我已经使用Gson生成项目了。
生成代码:
btnSalvar.setOnClickListener( new View.OnClickListener() {
public void onClick(View v) {
gson = new GsonBuilder().setPrettyPrinting().create();
final File file = new File(Environment.getExternalStorageDirectory() + "/download/ibbca/auditar.json");
// to check if file exists before before it maybe will be created
if (file.exists())
fileExists = true;
try{
// create file or get access to file
raf = new RandomAccessFile(file, "rw");
if (fileExists) // start new file as an array
raf.seek(file.length() - 1);
else { // start writing inside the bracket
raf.writeBytes("[");
raf.seek(file.length());
}
UserTestJson obj1 = new UserTestJson();
obj1.setId(10);
obj1.setName("Jhon");
obj1.setAge(20);
obj1.setPhone("202020");
toJson(obj1);
// end file
raf.writeBytes("]");
raf.close();
}catch(FileNotFoundException f){
f.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
Class UserTestJson,我用每个变量的get和seters创建。
答案 0 :(得分:4)
最简单的方法是,只需转到该json对象并为该键设置所需的值。
JSONArray arr = new JSONArray(str);
for(int i = 0; i < arr.length(); i++){
JSONObject jsonObj = (JSONObject)arr.get(i); // get the josn object
if(jsonObj.getString("name").equals("Rose")){ // compare for the key-value
((JSONObject)arr.get(i)).put("id", 22); // put the new value for the key
}
textview.setText(arr.toString());// display and verify your Json with updated value
}
答案 1 :(得分:1)
这可能是切换到ArrayAdapter的好时机。 我建议首先将JSON转移到自定义模型bean中:
class Person {
long id;
String phone, name, age;
}
然后您可以使用像gson这样的JSON解析器库将数组解析为List<Person>
并使用此数组来驱动列表。 (有关解析的示例,请参阅Gson help with parse array - works without array but won't with array)。
最后,当您准备回写数据时,只需从数组中重新生成JSON即可。这个问题就是一个例子:Trouble with Gson serializing an ArrayList of POJO's
优点:
缺点:
答案 2 :(得分:0)
我无法找到直接的方法。
但您可以先使用此功能解决问题。看看是否有其他解决方案
private JSONObject setJSONVal(JSONObject jsonObject, String index, String value) throws JSONException{
String jsonString = jsonObject.toString().trim();
jsonString = jsonString.replace("\"" + index + "\":\"" + jsonObject.getString(index) + "\"", "\"" + index + "\":\"" + value + "\"");
return new JSONObject(jsonString);
}