2013-09-23 112 views
17

私はJackson 2.2.3を使用しています。ソートされたフィールドキーを持つ文字列にJsonNodeツリーを変換する必要があります。私にはこれをどうやって行うのかは完全には不明です。特に逆はとても単純なので - JsonNode jn = ObjectMapper.readTree(String s)です。Jackson JsonNodeはソートされたキーで文字列にします

正しい方法はvoid writeTree(JsonGenerator jgen,JsonNode rootNode)と思われます。しかし、私はJsonGeneratorからシリアル化されたStringを取得する方法がありません。 JsonGenerator.Featureにはそのオプションがないので、SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYSがまだ適用されると私は推測します。これを行う簡単な方法がありますか?そうでない場合は、JsonGeneratorからシリアル化された文字列を取得するにはどうすればよいですか?

答えて

27

これはジャクソンの作家の一人が提供するように、これを行う最も簡単な方法です。現在のところ、ソートされたキーを使用してJsonNodeからStringにまっすぐ進む方法はありません。

private static final ObjectMapper SORTED_MAPPER = new ObjectMapper(); 
static { 
    SORTED_MAPPER.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true); 
} 

private String convertNode(final JsonNode node) throws JsonProcessingException { 
    final Object obj = SORTED_MAPPER.treeToValue(node, Object.class); 
    final String json = SORTED_MAPPER.writeValueAsString(obj); 
    return json; 
} 
+0

JSONでも配列をソートする方法はありますか?このソリューションはjson配列を持っているとうまくいきません:bacame '{collection:[z、y]、id:1}'ならばseiralizationの後に '{id:1、collection:[z、y]}' *全く注文しなかった! : – Cherry

+1

@Cherry配列を通常の順序で並べ替えるだけです。マップに並べ替える機能が必要なのは、配列には配列がないためです。配列はJSONにシリアル化する前に配列を並べ替えることができます。 (一般的に)マップでは不可能です。 – elhefe

関連する問題