2012-07-12 17 views
39

के माध्यम से धारावाहिक होने से एक बीन के अंदर एक नक्शा और शून्य क्षेत्रों के अंदर शून्य मूल्यों को कैसे रोकें मेरे पास Map<String,Foo> foosMap है जो मैं जैक्सन के माध्यम से क्रमबद्ध करना चाहता हूं। अब मैं क्रमबद्ध प्रक्रिया पर दो सेटिंग्स का पालन करना चाहता हूं:जैक्सन

  1. मानचित्र में बहुत सारे शून्य मूल्य और शून्य कुंजी हो सकती हैं और मैं नहीं चाहता कि नल को क्रमबद्ध किया जाए।
  2. उन सभी फ़ूज़ जो धारावाहिक हो रहे हैं, मैं फू के अंदर संदर्भित शून्य वस्तुओं को क्रमबद्ध नहीं करना चाहता हूं।

इसे प्राप्त करने का सबसे अच्छा तरीका क्या है? मैं अपने प्रोजेक्ट में जैक्सन-कोर 1.9 और जैक्सन-मैपर 1.9 जार का उपयोग कर रहा हूं।

+0

संभावित डुप्लिकेट, कृपया इस लिंक को देखें: http://stackoverflow.com/questions/3140563/how-to-avoi डी-नल-वैल्यू-सीरियलाइजेशन-इन-हैशमप – dbf

+0

मानचित्र में लगभग एक शून्य कुंजी – amicngh

+0

@ डीबीएफ नहीं हो सकती है। कृपया संपादित प्रश्न शीर्षक फिर से देखें। – Inquisitive

उत्तर

91

यदि वास्तविक Map डेटा संरचना को क्रमबद्ध करने के लिए क्रमशः वास्तविक मूल्य का प्रतिनिधित्व करने के लिए क्रमबद्ध किया जाना उचित है, तो यह शायद एक सभ्य दृष्टिकोण है, जो संभवतः जैक्सन कॉन्फ़िगरेशन की मात्रा को कम करेगा। उदाहरण के लिए, जैक्सन को कॉल करने से पहले, यदि संभव हो तो null कुंजी प्रविष्टियों को हटा दें। यही कारण है कि ने कहा ...


शून्य मान के साथ Map प्रविष्टियों serializing को दबाने के लिए:

से पहले जैक्सन 2.9

आप अभी भी WRITE_NULL_MAP_VALUES का उपयोग कर सकते हैं, लेकिन ध्यान दें कि यह SerializationFeature में ले जाया गया है:

mapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false); 

चूंकि

mapper.setDefaultPropertyInclusion(
    JsonInclude.Value.construct(Include.ALWAYS, Include.NON_NULL)) 

शून्य मान के साथ गुण serializing को दबाने के लिए, आप कर सकते हैं configure the ObjectMapper directly, या @JsonInclude एनोटेशन का इस्तेमाल करते हैं:

जैक्सन 2,9

WRITE_NULL_MAP_VALUES हटाई गई है, आप नीचे दिए गए बराबर उपयोग कर सकते हैं

mapper.setSerializationInclusion(Include.NON_NULL); 

या:

+०१२३५१६४१०
@JsonInclude(Include.NON_NULL) 
class Foo 
{ 
    public String bar; 

    Foo(String bar) 
    { 
    this.bar = bar; 
    } 
} 

अशक्त Map कुंजियों को संभालने के लिए कुछ कस्टम क्रमांकन आवश्यक है, सबसे अच्छा के रूप में मैं समझता हूँ।

import java.io.IOException; 
import java.util.HashMap; 
import java.util.Map; 

import com.fasterxml.jackson.annotation.JsonInclude.Include; 
import com.fasterxml.jackson.core.JsonGenerator; 
import com.fasterxml.jackson.core.JsonProcessingException; 
import com.fasterxml.jackson.databind.JsonSerializer; 
import com.fasterxml.jackson.databind.ObjectMapper; 
import com.fasterxml.jackson.databind.SerializationFeature; 
import com.fasterxml.jackson.databind.SerializerProvider; 

public class JacksonFoo 
{ 
    public static void main(String[] args) throws Exception 
    { 
    Map<String, Foo> foos = new HashMap<String, Foo>(); 
    foos.put("foo1", new Foo("foo1")); 
    foos.put("foo2", new Foo(null)); 
    foos.put("foo3", null); 
    foos.put(null, new Foo("foo4")); 

    // System.out.println(new ObjectMapper().writeValueAsString(foos)); 
    // Exception: Null key for a Map not allowed in JSON (use a converting NullKeySerializer?) 

    ObjectMapper mapper = new ObjectMapper(); 
    mapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false); 
    mapper.setSerializationInclusion(Include.NON_NULL); 
    mapper.getSerializerProvider().setNullKeySerializer(new MyNullKeySerializer()); 
    System.out.println(mapper.writeValueAsString(foos)); 
    // output: 
    // {"":{"bar":"foo4"},"foo2":{},"foo1":{"bar":"foo1"}} 
    } 
} 

class MyNullKeySerializer extends JsonSerializer<Object> 
{ 
    @Override 
    public void serialize(Object nullKey, JsonGenerator jsonGenerator, SerializerProvider unused) 
     throws IOException, JsonProcessingException 
    { 
    jsonGenerator.writeFieldName(""); 
    } 
} 

class Foo 
{ 
    public String bar; 

    Foo(String bar) 
    { 
    this.bar = bar; 
    } 
} 

null चाबियाँ, आगे कस्टम क्रमांकन प्रसंस्करण के लिए आवश्यक हो जाएगा के साथ Map प्रविष्टियों serializing को दबाने के लिए:

एक साधारण दृष्टिकोण रिक्त स्ट्रिंग (दो जैसा कि पहले उल्लेख विन्यास की पूरी उदाहरण सहित) के रूप में null कुंजी क्रमानुसार करने।

+2

को हटा दिया गया है, इन दिशाओं में केवल एक चेतावनी जैक्सन 2.0 विशिष्ट ('com.fasterxml' बनाम 'org.codehaus') है। –

+0

@ProgrammerBruce - क्या ऑब्जेक्ट मैपर में किसी विशिष्ट श्रेणी के लिए शून्य-क्षेत्र क्रमबद्धता को रोकना संभव है? उदाहरण: कक्षा ए और बी को क्रमबद्ध करने के लिए एक ही ऑब्जेक्ट मैपर का उपयोग करें, लेकिन कक्षा बी में केवल शून्य-फ़ील्ड को अनदेखा कर दिया जाता है। – ThatGuyGrant

+0

@ProgrammerBurce - जैसा जैकसन 2.9 तक अपग्रेड हो गया है, WRITE_NULL_MAP_VALUES को बहिष्कृत किया गया है। क्या आपको पता है कि ऐसा करने का कोई वैकल्पिक तरीका है? –

18

जैक्सन संस्करणों के लिए < 2।0 वर्ग पर यह व्याख्या का उपयोग किया जा रहा धारावाहिक:

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) 
+1

FYI, यह बहिष्कृत है, ऊपर दिए गए स्वीकृत उत्तर में नवीनतम एनोटेशन है: @JsonInclude (शामिल करें .NON_NULL) – Amber

+0

ध्यान दें कि यदि आप जैक्सन 1.9.x का उपयोग कर रहे हैं तो JsonInclude एनोटेशन उपलब्ध नहीं है, इस मामले में आपको JsonSerialize एनोटेशन का उपयोग करना होगा। –

+0

मैं जैक्सन 1.9.x के साथ पुष्टि करता हूं @JsonInclude (Include.NON_NULL) काम नहीं करता है। मैं इस पैकेज को आयात कर रहा हूं: org.codehaus.jackson.map – Emanuele

3

उत्तर एक छोटे से पुराने प्रतीत हो रहा है, क्या मैंने किया था इस नक्शाकार उपयोग करने के लिए एक MAP

 ObjectMapper mapper = new ObjectMapper().configure(SerializationConfig.Feature.WRITE_NULL_MAP_VALUES, false); 

एक सरल कन्वर्ट करने के लिए था Map:

  Map<String, Object> user = new HashMap<String,Object>(); 
      user.put("id", teklif.getAccount().getId()); 
      user.put("fname", teklif.getAccount().getFname()); 
      user.put("lname", teklif.getAccount().getLname()); 
      user.put("email", teklif.getAccount().getEmail()); 
      user.put("test", null); 

उदाहरण के लिए इस तरह यह प्रयोग करें:

 String json = mapper.writeValueAsString(user); 
0

मेरी समाधान, आशा मदद
कस्टम ObjectMapper व एक्सएमएल वसंत के config (संदेश conveters रजिस्टर)

public class PyResponseConfigObjectMapper extends ObjectMapper { 
public PyResponseConfigObjectMapper() { 
    disable(SerializationFeature.WRITE_NULL_MAP_VALUES); //map no_null 
    setSerializationInclusion(JsonInclude.Include.NON_NULL); // bean no_null 
} 

}