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

Tôi đã sử dụng JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS để viết số dưới dạng chuỗi trong json. Nhưng, tôi không thể tìm thấy tính năng tương tự để viết giá trị boolean dưới dạng chuỗi.Làm thế nào để viết giá trị boolean như String trong một mảng json?

Trả lời

5

Tôi cũng không thể tìm thấy tính năng tương tự cho boolean. Vì vậy, tôi đề nghị viết serializer mới và deserializer cho các trường boolean.

Xem ví dụ của tôi:

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

Output:

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

EDIT

Tôi nghĩ rằng, bạn nên thêm SimpleModule cấu hình để 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); 

Bây giờ, bạn sẽ có thể tuần tự hóa boolean/Object List-s và Map-s.

+0

Tôi đang viết toàn bộ danh sách hoặc một bản đồ để json. Một số yếu tố trong nó có thể là boolean. Có thể xử lý trường hợp này không? – Vignesh

-2

Tôi không hoàn toàn tìm ra wat bạn nói, nhưng hãy thử thay đổi loại boolean thành chuỗi. Thay vì true hãy thử "true", dưới dạng Chuỗi

+0

Tôi đang viết toàn bộ danh sách hoặc bản đồ thành json. Nếu đã đặt giá trị trong chúng như bạn đã nói, làm cách nào để đảm bảo rằng mọi bản đồ/danh sách chỉ chứa các giá trị Chuỗi (không phải là các boolean thô). – Vignesh

+0

Xin vui lòng, trèo xuống từ con ngựa cao của bạn và bỏ quá lén lút! Câu hỏi là một câu hỏi hợp lệ - làm thế nào để bạn tuần tự hóa một giá trị 'boolean' (hoặc một đối tượng' Boolean') thành một giá trị chuỗi JSON. –

Các vấn đề liên quan