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

Ho usato JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS per scrivere numeri come stringa in json. Ma non sono riuscito a trovare funzionalità simili per scrivere il valore booleano come stringa.Come scrivere il valore booleano come stringa in un array json?

risposta

5

Non sono riuscito a trovare funzionalità simili per boolean, anche. Quindi, propongo di scrivere un nuovo serializzatore e deserializzatore per i campi booleani.

Vedi il mio esempio:

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

uscita:

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

EDIT

credo, si dovrebbe aggiungere SimpleModule configurazione per 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); 

Ora, si dovrebbe essere in grado di serializzare booleani/Elenco oggetti e Mappa-s.

+0

Sto scrivendo l'intera lista o una mappa per JSON. Alcuni elementi possono essere booleani. È possibile gestire questo caso? – Vignesh

-2

Non ho capito bene che dici, ma prova a cambiare il tipo di booleano in stringa. Invece di true prova "true", come stringa

+0

Sto scrivendo l'intera lista o una mappa per JSON. Se dovessi inserire dei valori come hai detto tu, come faccio ad assicurarmi che ogni mappa/lista contenga solo valori di stringa (non i booleani grezzi). – Vignesh

+0

Per favore, scendi dal tuo cavallo e smettila di essere così snarky! La domanda è valida: come si serializza un valore 'booleano' (o un oggetto' Booleano') in una stringa JSON. –

Problemi correlati