2012-09-21 4 views
10

org.jsonからorg.codehaus.jacksonに移動したいと思います。次のJavaコードをどのように変換しますか?org.jsonからJSONObjectからorg.codehaus.jacksonへ

private JSONObject myJsonMessage(String message){ 
    JSONObject obj = new JSONObject(); 
    obj.put("message",message); 
    return obj; 
} 

簡潔にするため、ブロックを省いた。

答えて

19

代わりのJSONObject使用ジャクソンのObjectMapperObjectNode

ObjectMapper mapper = new ObjectMapper(); 
ObjectNode node = mapper.createObjectNode(); 
node.put("message", "text"); 

これはあなたの現在のorg.jsonコードのジャクソンのと同等になります。

しかし、Jacksonが本当に優れているのは、あなたのJavaクラス(POJO)とそのJSON表現との間で複雑なマッピングを行うことができることと、それと比べて本当に速いシリアル化を可能にするストリーミングAPIですorg.jsonの対応。

+0

したがって、 'jacksonObj'が返すオブジェクトですか? – kasavbere

+0

jacksonに関するすべての疑問を持って、私はorg.codehaus.jacksonがorg.jsonよりシンプルになることを望んでいました。あなたの助けを借りて投票してください。 – kasavbere

+0

@kasavbere:元の質問をよりよく反映するように答えを編集しました。シンプルさについては、それほど単純ではありませんが、あなたがそれでやりたいことに依存します。簡単なシリアライゼーションのために、 'org.json'を使う方が簡単です。しかし、大規模なオブジェクトのシリアライゼーションを行い、いくつかのカスタムニーズがある場合(例えば、 'Date'フィールドを' String'値としてシリアライズする場合)、Jacksonはこれまでのところ最良の選択肢です。 –

5

ジャクソンAPIにはJSONObjectがありません。 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; 
} 

この変更のもう一つの側面は、バックJSON文字列にMyMessageを変換するには、シリアル化コードを変更することになります。ジャクソンは、Javaビーンズ、デフォルトでマップは、あなたが例えばJSONObjectを作成する必要はありません、

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"}

を返しますありません。

+0

jacksonについてのすべてのご意見をいただければ、私はorg.codehaus.jacksonがorg.jsonより簡単になることを期待していました。あなたの助けを借りて投票してください。 – kasavbere

+0

前述のように、 'JsonNode'(ベースタイプ)または' ObjectNode'(特定のJSONオブジェクトサブタイプ)のどちらかと同等です。 org.jsonとは異なり、適切なOOアクセスのためのノード継承があります。 – StaxMan

1

ライブラリをorg.jsonライブラリからJackson個にアップグレードし、最初は同じAPIを保持する場合は、「Upgrade from org.json to Jackson」としてください。 これは、少なくともあなたのコードを基本的なJSONの読み書きについて約3倍速くするでしょう。ジャスト・ジャズはPOJOs(ObjectMapper.treeToValue(...)valueToTreeconvertValueなど)の間の変換を容易にするので、変換処理を開始することができます。

あなたがよく知っているツールは、あなたの思考を特定のパターンに偏らせる可能性があることを覚えておいてください。 ジャクソン(またはGSONやその他の成熟したJava JSONツール)の場合、JSON中心のツリーモデル(org.jsonが提供する)を使用する代わりに、適切なデータバインディングが役立つ場所を検討する必要があります。ツリーモデルは、あなたの思考をJSON構造に根付かせます。予想されるJSONを反映するためにPOJO構造を定義し、Javaオブジェクトで直接操作するより自然なパターンを見ることを妨げる可能性があります。