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

Ich verwendete JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS, um Zahlen als Zeichenfolge in JSON zu schreiben. Aber ich konnte ähnliches Merkmal nicht finden, um booleschen Wert als Zeichenkette zu schreiben.Wie schreibe ich booleschen Wert als String in einem JSON-Array?

Antwort

5

Ich konnte ähnliche Funktion für Boolean auch nicht finden. Also, ich schlage vor, neue Serializer und Deserializer für boolesche Felder zu schreiben. mein Beispiel

Siehe:

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 + "]"; 
    } 
} 

Ausgang:

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

EDIT

denke ich, sollten Sie fügen SimpleModule Konfiguration ObjectMapper:

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

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

Nun sollten Sie in der Lage sein, boolesche/Objektlisten und Map-s zu serialisieren.

+0

Ich schreibe die ganze Liste oder eine Karte nach json. Einige Elemente können boolesch sein. Ist es möglich, diesen Fall zu behandeln? – Vignesh

-2

Ich nicht ganz herausgefunden, was Sie sagen, aber versuchen Sie, den Typ der booleschen in Zeichenfolge zu ändern. Anstelle von true versuchen Sie , als String

+0

Ich schreibe die ganze Liste oder eine Karte nach json. Wenn Sie, wie Sie gesagt haben, Werte in sie setzen sollten, wie stelle ich sicher, dass jede Map/Liste nur String-Werte enthält (nicht die rohen booleschen). – Vignesh

+0

Bitte, kletter runter von deinem hohen Pferd und hör auf so snarky zu sein! Die Frage ist eine gültige - wie serialisiert man ein 'boolesches' (oder ein' Boolesches'Objekt) -Wert in einen JSON-String. –

Verwandte Themen