web-dev-qa-db-ja.com

JsonObject / JsonArrayの値を直接変更する方法は?

JSON文字列をGSONが提供するJsonObjectクラスに解析したら(意味のあるデータオブジェクトに解析したくないが、厳密にJsonObjectを使用したい場合)、どのようにしてフィールド/値を変更できますか直接キー?

私に役立つAPIはありません。

https://static.javadoc.io/com.google.code.gson/gson/2.6.2/com/google/gson/JsonObject.html

24
Oh Chin Boon

奇妙なことに、答えはプロパティを追加し続けることです。私はsetterメソッドを半分期待していた。 :S

System.out.println("Before: " + obj.get("DebugLogId")); // original "02352"

obj.addProperty("DebugLogId", "YYY");

System.out.println("After: " + obj.get("DebugLogId")); // now "YYY"
58
Oh Chin Boon

これは、JSONObjectを使用してchildkey値を変更するために機能します。使用されるインポートは

import org.json.JSONObject;

ex json :(入力として与えている間にjsonファイルを文字列に変換します)

{
    "parentkey1": "name",
    "parentkey2": {
     "childkey": "test"
    },
}

コード

JSONObject jObject  = new JSONObject(String jsoninputfileasstring);
jObject.getJSONObject("parentkey2").put("childkey","data1");
System.out.println(jObject);

出力:

{
    "parentkey1": "name",
    "parentkey2": {
     "childkey": "data1"
    },
}
9

Gsonライブラリの2.3バージョン以降、JsonArrayクラスには「set」メソッドがあります。

以下に簡単な例を示します。

JsonArray array = new JsonArray();
array.add(new JsonPrimitive("Red"));
array.add(new JsonPrimitive("Green"));
array.add(new JsonPrimitive("Blue"));

array.remove(2);
array.set(0, new JsonPrimitive("Yelow"));
5
micaelgallego

別のアプローチは、Java.util.Mapに逆シリアル化し、必要に応じてJava Mapを変更するだけです。これにより、Java側のデータ処理がデータ転送から分離されます。メカニズム(JSON)。これは、コードを整理する方法です。データ転送にJSONを使用し、代わりのデータ構造として使用します。

1

実際にはすべてドキュメントにあります。
JSONObjectとJSONArrayの両方を使用して、標準のデータ構造を置き換えることができます。
セッターを実装するには、remove(String name)の前にput(String name, Object value)を呼び出すだけです。

以下に簡単な例を示します。

public class BasicDB {

private JSONObject jData = new JSONObject;

public BasicDB(String username, String tagline) {
    try {
        jData.put("username", username);
        jData.put("tagline" , tagline);
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

public String getUsername () { 
    String ret = null;
    try {
        ret = jData.getString("username");
    } catch (JSONException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } 
    return ret;
}

public void setUsername (String username) { 
    try {
        jData.remove("username");
        jData.put("username" , username);
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

public String getTagline () {
    String ret = null;
    try {
        ret = jData.getString("tagline");
    } catch (JSONException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } 
    return ret;
}
0