org.json
からに移動したいですorg.codehaus.jackson
。次の Java コードを変換するにはどうすればよいですか?
private JSONObject myJsonMessage(String message){
JSONObject obj = new JSONObject();
obj.put("message",message);
return obj;
}
簡単にするためにtry-catch
ブロックを省略しました。
JSONObject
Jackson のObjectMapper
andを使用する代わりにObjectNode
:
ObjectMapper mapper = new ObjectMapper();
ObjectNode node = mapper.createObjectNode();
node.put("message", "text");
これは、ジャクソンの現在のorg.json
コードに相当します。
ただし、Jackson が本当に優れているのは、Java クラス (POJO) とその JSON 表現の間の複雑なマッピングを行う能力と、少なくともorg.json
の対応するものと比較した場合に、非常に高速なシリアル化を可能にするストリーミング API です。
JSONObject
Jackson APIにはありません。を返すのではなく、JSONObject
getter と setter を持つメッセージ プロパティを持つ Map または Java Bean を返すことができます。
public class MyMessage {
private String message;
public void setMessage(final String message) {
this.message = message;
}
public String getMessage() {
return this.message;
}
}
したがって、メソッドは次のように削減されます。
private MyMessage(String message) {
MyMessage myMessage = new MyMessage();
myMessage.setMessage(message);
return myMessage;
}
この変更のもう 1 つの側面は、シリアライゼーション コードを変更して、MyMessage を json 文字列に戻すことです。JSONObject
ジャクソンはJava Beansを行い、デフォルトでマップします。たとえば、作成する必要はありません。
private String serializeMessage(MyMessage message){
//Note: you probably want to put it in a global converter and share the object mapper
ObjectMapper mapper = new ObjectMapper();
return mapper.writeValueAsString(message);
}
上記が返ってきます{message: "some message"}
簡潔にするために例外をスキップしました。
org.json
ライブラリからJackson
少しずつアップグレードし、最初は同じ API を保持する場合は、「 org.json から Jackson へのアップグレード」を参照してください。これにより、基本的な JSON の読み取りと書き込みのコードが少なくとも約 3 倍速くなります。さらに、必要に応じて変換処理を開始することもできます。Jackson を使用すると、ツリーと POJO の間 ( 、 POJO 間など) を簡単に変換できるからObjectMapper.treeToValue(...)
です。valueToTree
convertValue
使い慣れたツールは、思考を特定のパターンに偏らせる可能性があることを覚えておいてください。心を開いておくことで、さらに優れたツールを見つけることができます。Jackson (または GSON またはその他の成熟した Java JSON ツール) の場合、(org.json が提供する) JSON 中心のツリー モデルを使用する代わりに、適切なデータ バインディングが役立つ場所を検討する必要があります。ツリー モデルは、思考を JSON 構造に基づいたものに保ちます。これは便利な場合があります。しかし、予想される JSON を反映するように POJO 構造を定義し、Java オブジェクトを直接操作することで得られる、より自然なパターンが見られなくなる可能性もあります。