2013-05-15 22 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數組中寫入布爾值作爲字符串?

回答

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

輸出:

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

編輯

我想,你應該添加SimpleModule配置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); 

現在,你應該能夠序列化布爾/對象列表-s和Map-s。

+0

我正在將整個列表或地圖寫入json。其中的一些元素可能是布爾值。是否有可能處理這種情況? – Vignesh

-2

我不是很清楚你說的wat,但是嘗試將boolean的類型改爲string。而不是true嘗試"true",作爲字符串

+0

我正在寫整個列表或地圖到json。如果要像你說的那樣在其中添加值,我如何確保每個地圖/列表只包含字符串值(而不是原始布爾值)。 – Vignesh

+0

請從你的高馬爬下來,不要這麼sn!!這個問題是一個有效的問題 - 你如何序列化一個布爾值(或布爾對象)值爲JSON字符串值。 –

相關問題