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 ファイルを更新する必要があります。これを行う方法?

例: ユーザー Rose であるレコード ID 22 を変更したい。

詳細情報を追加:

私はすでに 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 と seter で作成しました。

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 パーサー ライブラリを使用して配列を解析し、List<Person>この配列を使用してリストを操作できます。(解析の例については、解析配列に関する Gson のヘルプを参照してください - 配列なしでは機能しますが、配列では機能しません)。

最後に、データを書き戻す準備ができたら、配列から JSON を再生成するだけです。This questionはその例を示しました: Trouble with Gson serializing an ArrayList of POJO's

長所:

  • JSON データ モデルが変更されたら、モデルを少し変更するだけで、新しい形式を読み取ることができます。
  • ArrayList や POJO などの標準 Java ツールを使用できます。

短所:

  • GSON または同等のものをプロジェクトにインポートする必要があります。
于 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 に答える