如何编辑json文件中的项目?

时间:2013-05-21 02:39:41

标签: android json

我有这个由我的应用程序生成的结构,我在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创建。

3 个答案:

答案 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

优点:

  • 一旦您的JSON数据模型发生变化,只需要对模型进行一些小改动即可阅读新格式。
  • 您可以使用标准Java工具,如ArrayList和POJOs

缺点:

答案 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);
}