FastJSONとクローン
1208 ワード
アリババのオープンソースキットFastJSONはJSONデータを処理するときにとても使いやすいですが、私が最近実習で使っていたとき、コピーの問題という非常に簡単な落とし穴を見つけました.例として、例えばJsonオブジェクトaは ですそれから私はaの値と同じ新しいJSONオブジェクトが必要で、直接new を発見することができますそれからaの中の値を修正して、bのも 変わったことを発見します
ソースコードをめくると、JSONObjectはMapインタフェースを実現し、中にはデータを格納するメンバー変数mapがある.そこで私のnew文はこのように実現しました.
これは元のオブジェクトaのmap参照をbに伝えただけで,2つのJSONオブジェクトのmapは1つのものである.では、私が望む結果をどのように実現するのでしょうか.そうだ、クローンだ.JSONObjectクラスはcloneableインタフェースのclone方法を実現した:
ここは確かにnewが新しいHashMapを作って、それを使ってnewが新しいJSOnObjectを私たちにくれたことがわかります.正しい書き方:
一言で言えば、HashMapの内部コンテナは配列で、ここでnew HashMap(map)は新しいHashMapを作成し、mapのキー値のペアを自分の配列に配置します.
JSONObject a = new JSONObject();
a.put("key1","value1");
JSONObject b = new JSONObject(a);
a.put("key1","value2");
System.out.println(b.getString("key1");
//output : value2
ソースコードをめくると、JSONObjectはMapインタフェースを実現し、中にはデータを格納するメンバー変数mapがある.そこで私のnew文はこのように実現しました.
public JSONObject(Map map){
this.map = map;
}
これは元のオブジェクトaのmap参照をbに伝えただけで,2つのJSONオブジェクトのmapは1つのものである.では、私が望む結果をどのように実現するのでしょうか.そうだ、クローンだ.JSONObjectクラスはcloneableインタフェースのclone方法を実現した:
@Override
public Object clone() {
return new JSONObject(new HashMap(map));
}
ここは確かにnewが新しいHashMapを作って、それを使ってnewが新しいJSOnObjectを私たちにくれたことがわかります.正しい書き方:
JSONObject b = (JSONObject)a.clone();
一言で言えば、HashMapの内部コンテナは配列で、ここでnew HashMap(map)は新しいHashMapを作成し、mapのキー値のペアを自分の配列に配置します.