2013-05-15 4 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 का उपयोग जेसन में स्ट्रिंग के रूप में संख्याओं को लिखने के लिए किया था। लेकिन, मुझे स्ट्रिंग के रूप में बूलियन मान लिखने के लिए समान सुविधा नहीं मिली।एक जेसन सरणी में स्ट्रिंग के रूप में बूलियन मान कैसे लिखें?

उत्तर

5

मुझे बूलियन के लिए भी इसी तरह की सुविधा नहीं मिल सका। तो, मैं बूलियन क्षेत्रों के लिए नए धारावाहिक और deserializer लिखने का प्रस्ताव है।

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); 

अब, आप बूलियन/ऑब्जेक्ट लिस्ट-एस और मैप-एस को क्रमबद्ध करने में सक्षम होना चाहिए।

+0

मैं पूरी सूची या जेसन के लिए एक नक्शा लिख ​​रहा हूँ। इसमें कुछ तत्व बुलियन हो सकते हैं। क्या इस मामले को संभालना संभव है? – Vignesh

-2

मुझे लगता है कि आप कहने के लिए काफी कुछ नहीं समझते हैं, लेकिन बूलियन के प्रकार को स्ट्रिंग में बदलने का प्रयास करें। true के बजाय "true" का प्रयास करें, स्ट्रिंग

+0

मैं पूरी सूची या जेसन के लिए एक नक्शा लिख ​​रहा हूं। यदि आपने कहा कि उनमें मूल्यों को रखना था, तो मैं कैसे सुनिश्चित करूं कि प्रत्येक मानचित्र/सूची में केवल स्ट्रिंग मान होते हैं (कच्चे बूलियन नहीं)। – Vignesh

+0

कृपया, अपने ऊंचे घोड़े से नीचे चढ़ो और इतने घबराहट से बाहर निकलें! प्रश्न एक वैध है - आप एक JSON स्ट्रिंग मानों के लिए 'बूलियन' (या 'बूलियन' ऑब्जेक्ट) मानों को क्रमबद्ध कैसे करते हैं। –

संबंधित मुद्दे