2012-11-15 30 views
5

मैं जैक्सन का उपयोग कर जावा POJO में JSON deserialize करने की कोशिश कर रहा हूँ। दूर गोपनीय जानकारी दिए बिना, यहां एक उदाहरण स्टैक ट्रेस है जब ObjectMapper के अक्रमांकन विफल रहता है:जैक्सन एक एनम कुंजी के साथ मानचित्र में deserializing, POJO मूल्य

org.codehaus.jackson.map.JsonMappingException: Can not construct Map key of type com.example.MyEnum from String "coins": not a valid representation: Can not construct Map key of type com.example.MyEnum from String "coins": not one of values for Enum class 

मेरे JSON इस तरह दिखता है:

"foo": { 
    "coins": null, 
    ... 
} 

और वर्ग मैं में deserialize करना चाहते हैं तो इस क्षेत्र में है:

private Map<MyEnum, MyPojo> foo; 

और मेरी enum प्रकार इस तरह दिखता है:

public enum MyEnum { 
    COINS("coins"), 
    ... 
} 

मुझे एहसास है कि मैं एक शून्य मूल्य deserialize करने की कोशिश कर रहा हूँ। लेकिन मेरा मानना ​​है कि यह अभी भी काम करना चाहिए: deserialization का परिणाम foo.put(MyEnum.COINS, null) के साथ एक नक्शा रखने के बराबर होना चाहिए, जो वास्तव में एक वैध जावा निर्देश है। सहायता बहुत सराहना की है, अग्रिम धन्यवाद।

+1

अपने गणन कक्षा में एक स्थिर कारखाने विधि है कि स्ट्रिंग – hoaz

+1

द्वारा enum निर्माण करती है और जारी करने के लिए कारण यह है कि डिफ़ॉल्ट रूप से जैक्सन 'enum.name() का उपयोग करता है प्रदान करते हैं' आईडी के रूप में - और इस मामले में, नाम है "कोन्स", लो-केस "सिक्के" नहीं। उत्तर के रूप में, इसके आसपास के तरीके हैं। – StaxMan

उत्तर

8

एक अच्छा समाधान के अलावा प्रस्तुत (कारखाना विधि), 2 अन्य तरीके हैं:

  • यदि 'MyEnum.toString()' वापसी होगी "सिक्के", आप जैक्सन का उपयोग करें "toString()" पर "नाम()" ObjectMapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING)
  • 01 के साथ कर सकते हैं
  • आप आईडी को वापस करने के लिए कुछ अन्य विधि जोड़ सकते हैं, और उस विधि को @JsonValue एनोटेशन के साथ चिह्नित करें (आप वास्तव में उपरोक्त सुविधा को सक्षम करने के बजाय toString() पर भी इसका उपयोग कर सकते हैं) - यदि वह एनोटेशन मौजूद है, तो उस विधि द्वारा मूल्य लौटाया गया आईडी के रूप में प्रयोग किया जाता है।
7

जीआरआर! पता लगा लिया।

मेरे लिए समाधान एक स्थिर विधि बनाना था, @JsonCreator के साथ एनोटेटेड, मेरे enum में जो स्ट्रिंग पैरामीटर के आधार पर enum का उदाहरण बनाता है।

@JsonCreator 
public static MyEnum create(String str) { 
    // code to return an enum based on the String parameter 
} 
5

अपने गणन कक्षा में एक स्थिर कारखाने विधि है कि स्ट्रिंग द्वारा enum निर्माण करती है प्रदान करें और @JsonCreator साथ उस पर टिप्पणी: यह इस तरह से देखा

@JsonCreator 
public static MyEnum fromValue(String v) { 
    for (MyEnum myEnum : values()) { 
     if (myEnum.text.equals(v)) { 
      return myEnum; 
     } 
    } 
    throw new IllegalArgumentException("invalid string value passed: " + v); 
}