1

我有这个由我的应用程序生成的结构,我在 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();
    }

}
}); 

还有 UserTestJson 类,我使用 get 和 seters 为每个变量创建。

4

3 回答 3

5

最简单的方法是,只需转到该 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
}
于 2013-05-21T03:12:14.427 回答
1

现在可能是切换到ArrayAdapter的好时机。我建议先将 JSON 传输到自定义模型 bean:

class Person {
    long id;
    String phone, name, age;
}

然后,您可以使用像gson这样的 JSON 解析器库将数组解析为 aList<Person>并使用该数组来驱动您的列表。(请参阅Gson 解析数组的帮助 - 没有数组但不适用于数组)以获取有关解析的示例。

最后,当您准备好写回数据时,只需从数组中重新生成 JSON。这个问题有一个例子:Trouble with Gson serializing an ArrayList of POJO's

优点:

  • 一旦您的 JSON 数据模型发生更改,只需对模型进行少量更改即可读取新格式。
  • 您可以使用标准的 Java 工具,例如 ArrayList 和 POJO

缺点:

于 2013-05-21T02:50:26.700 回答
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);
}
于 2013-05-21T02:55:12.203 回答