1

私はこのコードを使用しています:

JSONObject jO = new JSONObject();

try {
    jO.put("item1", true);
    jO.put("item2", value2);
    jO.put("item3", value3);
} catch (JSONException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}

String json = null;
try {
    json = jO.toString(4);
} catch (JSONException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}

File jsonFile = new File(nContext.getDir("json", 0), "dashboard.json");
//simple utility method to write the json file
Utils.writeToFile(jsonFile, json);

この結果を得るには:

{
    "item3": "12345",
    "item2": "abcde",
    "item1": true
}

私が達成したいのは、同じコードの次の実行時に、次のようなもので終わることです:

{
    "pass1": {
        "item3": "12345",
        "item2": "abcde",
        "item1": true
    },
    "pass2": {
        "item3": "67890",
        "item2": "zxcvb",
        "item1": true
    }
}

それとも、これを持っている方が良いでしょうか?

{
    "pass1": [
        {
            "item3": "12345",
            "item2": "abcde",
            "item1": true
        }
    ],
    "pass2": [
        {
            "item3": "67890",
            "item2": "zxcvb",
            "item1": true
        }
    ]
}

これは、「ネストされた」オブジェクト/配列を含めるようにコードを変更することを意味することを知っています。を構築するために JSON を解析する必要があることを考えると、どちらが優れていますListViewか? 何か案は?

4

2 に答える 2

2

他のユーザーからのコメントと「廃止された」回答のおかげで、解決策が見つかりましたが、ここにはもうありません。はっきりしなかったのは私のせいかもしれません。

public void addEntryToJsonFile(Context ctx, String id, String name, String size) {

    // parse existing/init new JSON 
    File jsonFile = new File(ctx.getDir("my_data_dir", 0), "my_json_file.json");
    String previousJson = null;
    if (jsonFile.exists()) {
        try {
            previousJson = Utils.readFromFile(jsonFile);
        } catch (IOException e) {
            e.printStackTrace();
        }
    } else {
        previousJson = "{}";
    }

    // create new "complex" object
    JSONObject mO = null;
    JSONObject jO = new JSONObject();

    try {
        mO = new JSONObject(previousJson);
        jO.put("completed", true);
        jO.put("name", name);
        jO.put("size", size);
        mO.put(id, jO); //thanks "retired" answer
    } catch (JSONException e) {
        e.printStackTrace();
    }

    // generate string from the object
    String jsonString = null;
    try {
        jsonString = mO.toString(4);
    } catch (JSONException e) {
        e.printStackTrace();
    }

    // write back JSON file
    Utils.writeToFile(jsonFile, jsonString);

}
于 2013-06-06T17:09:41.193 に答える
1

dentexコメントの後に編集

  1. ファイルを読む
  2. ルート Json オブジェクトを解析する
  3. ルート オブジェクトが複合オブジェクトでない場合
    1. 新しいルート オブジェクトを作成する
    2. ルートオブジェクトをその中に入れます
  4. 2 番目のオブジェクトをルート オブジェクトに配置します
  5. ファイルを書き戻す

疑似コードで:

oldJson = ParseJsonFromFile()
newJson = {"item1": true, "item2": "abcde" ...}
JSONObject root;
if (oldJson.hasKey("pass1") {
    root = oldJson
} else {
    root = new JSONObject()
    root.add("pass1", oldJson)
}
root.add("pass" + root.getSize() + 2, newJson)
WriteJsonToFile(root)
于 2013-06-06T10:00:48.827 に答える