दिलचस्प पोस्ट
कॉल स्टेटस बार में (बाधाओं को संतुष्ट करने में असमर्थ) मूल्य के लिए क्या अंतर है :, objectForKey:, और valueForKeyPath :? दो भौगोलिक बिंदुओं के बीच दूरी प्राप्त करें पाठ-संरेखित केंद्र का उपयोग कर केंद्र छवि? मैं दिनांक को दिए गए दिनांक संख्या की गणना कैसे करूं? स्प्रिंग सुरक्षा के साथ जावा कोड में "हैरोल" कैसे जांचें? @grant मान सेट होने पर `विंडो` (लक्ष्य पृष्ठ) ऑब्जेक्ट कैसे एक्सेस करें? JQuery में, मैं एक तत्व को इसके नाम विशेषता से कैसे चुनूं? लिबिटिफ का उपयोग सी # से (टाइल वाली TIFF छवियों तक पहुंचने के लिए) जावास्क्रिप्ट में बहु मान लौटें? प्रपत्र प्रमाणन समयबाह्य बनाम सत्र कालबाह्य क्या रैखिक समीकरणों को हल करने के लिए एक अजगर मॉड्यूल है? जब उपयोगकर्ता इसके बाहर क्लिक करता है तो एक DIV छिपाने के लिए jQuery का उपयोग करें एएसपी.नेट एमवीसी में मॉडल में यूआरएल हेल्पर को कॉल करें मुझे कैसे पता चलेगा कि कोई चेकबॉक्स चेक है या नहीं?

Serialization और deserialization के दौरान JSON संपत्ति के विभिन्न नाम

क्या यह संभव है: कक्षा में एक फ़ील्ड है, लेकिन जैक्सन पुस्तकालय में serialization / deserialization के दौरान इसके लिए अलग-अलग नाम हैं?

उदाहरण के लिए, मेरे पास वर्ग "कोर्डिनेनेस" है

class Coordinates{ int red; } 

JSON से घिनौनापन के लिए इस तरह से प्रारूप होना चाहता हूँ:

 { "red":12 } 

लेकिन जब मैं ऑब्जेक्ट को सीरियल कर दूंगा, परिणाम इस तरह होना चाहिए:

 { "r":12 } 

मैंने getter और setter (विभिन्न मानों के साथ) पर @ जेसनप्रॉपर्टी एनोटेशन लागू करके इसे लागू करने की कोशिश की:

 class Coordiantes{ int red; @JsonProperty("r") public byte getRed() { return red; } @JsonProperty("red") public void setRed(byte red) { this.red = red; } } 

लेकिन मुझे एक अतीत प्राप्त हुआ है:

 org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "red" 

वेब के समाधान से एकत्रित समाधान "Serialization और deserialization के दौरान JSON संपत्ति के विभिन्न नाम"

बस परीक्षण और यह काम करता है:

 public class Coordinates { byte red; @JsonProperty("r") public byte getR() { return red; } @JsonProperty("red") public void setRed(byte red) { this.red = red; } } 

विचार यह है कि विधि के नाम अलग होने चाहिए, इसलिए जैक्सन इसे अलग-अलग क्षेत्रों के रूप में पार्स करता है, एक फ़ील्ड के रूप में नहीं।

यहां परीक्षण कोड है:

 Coordinates c = new Coordinates(); c.setRed((byte) 5); ObjectMapper mapper = new ObjectMapper(); System.out.println("Serialization: " + mapper.writeValueAsString(c)); Coordinates r = mapper.readValue("{\"red\":25}",Coordinates.class); System.out.println("Deserialization: " + r.getR()); 

परिणाम:

 Serialization: {"r":5} Deserialization: 25 

मैं सिर्फ दो अलग अलग गेटर्स / सेटर्स जोड़ी को एक चर में बाँधता हूं:

 class Coordiantes{ int red; @JsonProperty("red") public byte getRed() { return red; } public void setRed(byte red) { this.red = red; } @JsonProperty("r") public byte getR() { return red; } public void setR(byte red) { this.red = red; } } 

आप @ जेसन अलिअस का उपयोग कर सकते हैं जो जैक्सन 2.9.0 में पेश हुए

उदाहरण:

 public class Info { @JsonAlias({ "r", "red" }) public String r; } 

यह ऐसा नहीं था जो मुझे समाधान के रूप में आशा कर रहा था (हालांकि यह एक वैध उपयोग मामला है)। मेरी आवश्यकता एक वैकल्पिक बग़ी ग्राहक (एक मोबाइल ऐप जो पहले से ही जारी है) को वैकल्पिक नामों का उपयोग करने की अनुमति देना था।

समाधान इस तरह एक अलग सेटर विधि प्रदान करने में निहित है:

 @JsonSetter( "r" ) public void alternateSetRed( byte red ) { this.red = red; } 

सामान्य गायक / सेटर जोड़ी होना संभव है। आपको @JsonProperty में पहुंच मोड निर्दिष्ट करने की आवश्यकता है

इसके लिए इकाई परीक्षण यहां दिया गया है:

 public class JsonPropertyTest { private static class TestJackson { private String color; @JsonProperty(value = "device_color", access = JsonProperty.Access.READ_ONLY) public String getColor() { return color; }; @JsonProperty(value = "color", access = JsonProperty.Access.WRITE_ONLY) public void setColor(String color) { this.color = color; } } @Test public void shouldParseWithAccessModeSpecified() throws Exception { String colorJson = "{\"color\":\"red\"}"; ObjectMapper mapper = new ObjectMapper(); TestJackson colotObject = mapper.readValue(colorJson, TestJackson.class); String ser = mapper.writeValueAsString(colotObject); System.out.println("Serialized colotObject: " + ser); } } 

मुझे निम्नानुसार उत्पादन मिला है:

 Serialized colotObject: {"device_color":"red"} 

वे इसे एक फीचर के रूप में शामिल कर चुके होंगे, क्योंकि अब एक अलग सेटर और @JsonProperty परिणाम के लिए अलग-अलग @JsonProperty सेट करना होगा जो आपको अपेक्षा करता है (समान क्षेत्र के लिए सीरियलाइजेशन और डिसेराइलाइजेशन के दौरान अलग प्रॉपर्टी नाम)। जैक्सन संस्करण 2.6.7

आप ऐसा करने के लिए एक सीरिजलाइज वर्ग लिख सकते हैं:

सार्वजनिक वर्ग प्रतीक

{निजी स्ट्रिंग प्रतीक;

  private String name; public String getSymbol() { return symbol; } public void setSymbol(String symbol) { this.symbol = symbol; } public String getName() { return name; } public void setName(String name) { this.name = name; } 

}

सार्वजनिक श्रेणी के प्रतीकजोनसियाराइलाइजर JsonSerializer को बढ़ाता है {

 @Override public void serialize(Symbol symbol, JsonGenerator jgen, SerializerProvider serializers) throws IOException, JsonProcessingException { jgen.writeStartObject(); jgen.writeStringField("symbol", symbol.getSymbol()); //Changed name to full_name as the field name of Json string jgen.writeStringField("full_name", symbol.getName()); jgen.writeEndObject(); } 

}

  ObjectMapper mapper = new ObjectMapper(); SimpleModule module = new SimpleModule(); module.addSerializer(Symbol.class, new SymbolJsonSerializer()); mapper.registerModule(module); //only convert non-null field, option... mapper.setSerializationInclusion(Include.NON_NULL); String jsonString = mapper.writeValueAsString(symbolList);