2013-05-15 14 views
6
JsonGenerator generator = 
       new JsonFactory().createJsonGenerator(new JSONWriter(response)); 
generator.configure(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS, true); 

私はJsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGSを使用して、数字をjsonの文字列として書き込みました。しかし、私は文字列としてブール値を書くために同様の機能を見つけることができませんでした。ブール値をjson配列にStringとして書き込む方法は?

答えて

5

ブール型の同様の機能も見つかりませんでした。だから、私はブール値フィールドのための新しいシリアライザとデシリアライザを書くことを提案します。

私の例を参照してください。

public class JacksonProgram { 

    public static void main(String[] args) throws IOException { 
     Foo foo = new Foo(); 
     foo.setB(true); 
     foo.setS("Test"); 
     foo.setI(39); 

     ObjectMapper objectMapper = new ObjectMapper(); 
     JsonFactory jsonFactory = new JsonFactory(); 

     StringWriter stringWriter = new StringWriter(); 
     JsonGenerator jsonGenerator = jsonFactory.createGenerator(stringWriter); 
     jsonGenerator.enable(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS); 
     objectMapper.writeValue(jsonGenerator, foo); 
     System.out.println(stringWriter); 

     JsonParser jsonParser = jsonFactory.createJsonParser(stringWriter.toString()); 
     Foo value = objectMapper.readValue(jsonParser, Foo.class); 
     System.out.println(value); 
    } 
} 

class BooleanSerializer extends JsonSerializer<Boolean> { 

    @Override 
    public void serialize(Boolean value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException { 
     jsonGenerator.writeString(value.toString()); 
    } 
} 

class BooleanDeserializer extends JsonDeserializer<Boolean> { 

    public Boolean deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { 
     return Boolean.valueOf(jsonParser.getValueAsString()); 
    } 
} 

class Foo { 

    @JsonSerialize(using = BooleanSerializer.class) 
    @JsonDeserialize(using = BooleanDeserializer.class) 
    private boolean b; 
    private String s; 
    private int i; 

    public boolean isB() { 
     return b; 
    } 

    public void setB(boolean b) { 
     this.b = b; 
    } 

    public String getS() { 
     return s; 
    } 

    public void setS(String s) { 
     this.s = s; 
    } 

    public int getI() { 
     return i; 
    } 

    public void setI(int i) { 
     this.i = i; 
    } 

    @Override 
    public String toString() { 
     return "Foo [b=" + b + ", s=" + s + ", i=" + i + "]"; 
    } 
} 

出力:私は、あなたがObjectMapperSimpleModule設定を追加すべきだと思う

{"b":"true","s":"Test","i":"39"} 
Foo [b=true, s=Test, i=39] 

EDIT

SimpleModule simpleModule = new SimpleModule("BooleanModule"); 
simpleModule.addSerializer(Boolean.class, new BooleanSerializer()); 
simpleModule.addDeserializer(Boolean.class, new BooleanDeserializer()); 

ObjectMapper objectMapper = new ObjectMapper(); 
objectMapper.registerModule(simpleModule); 

これで、boolean/Object List-sとMap-sをシリアル化できるはずです。

+0

私はリスト全体またはjsonへのマップを書いています。その中のいくつかの要素はブール値かもしれません。このケースを扱うことは可能ですか? – Vignesh

-2

私はあなたが言っていることをかなり理解していませんが、論理型を文字列に変更してみてください。 trueの代わりに"true"を文字列として

+0

私はリスト全体またはjsonへの地図を書いています。あなたが言ったように値を入れたら、どのマップ/リストにもストリング値(生のブール値ではない)だけが含まれていることを確認するにはどうすればいいですか? – Vignesh

+0

あなたの高い馬から降りて、すごく恥ずかしいことをやめてください!質問は有効なものです - あなたは 'boolean'(または' Boolean'オブジェクト)の値をJSON文字列値にシリアル化する方法を教えてください。 –

関連する問題