2011-05-31 19 views
15
public class UserAction { 
    private final UUID uuid; 
    private String userId; 
    /* more fields, setters and getters here */ 

    public UserAction(){ 
     this.uuid = UUID.fromString(new com.eaio.uuid.UUID().toString()); 
    } 

    public UserAction(UUID uuid){ 
     this.uuid = uuid; 
    } 
    @Override 
    public boolean equals(Object obj) { 
     if (obj == null) { 
      return false; 
     } 
     if (getClass() != obj.getClass()) { 
      return false; 
     } 
     final UserAction other = (UserAction) obj; 
     if (this.uuid != other.uuid && (this.uuid == null || !this.uuid.equals(other.uuid))) { 
      return false; 
     } 
     return true; 
    } 

    @Override 
    public int hashCode() { 
     int hash = 7; 
     hash = 53 * hash + (this.uuid != null ? this.uuid.hashCode() : 0); 
     return hash; 
    } 
} 

मैं इस वर्ग को क्रमबद्ध और deserialize करने के लिए जीसन का उपयोग कर रहा हूँ। आज के रूप में मुझे इस वस्तु में एक अंतिम यूयूआईडी जोड़ना पड़ा। मुझे serializing कोई समस्या नहीं है। Deserializing जब मुझे public UserAction(UUID uuid) कन्स्ट्रक्टर का उपयोग करने के लिए जीसन को मजबूर करने की आवश्यकता है। मैं उसे कैसे प्राप्त कर सकता हूं ?विशिष्ट निर्माता का उपयोग करने के लिए फोर्स जीएसओएन

उत्तर

17

आप एक कस्टम JsonDeserializer लागू कर सकते हैं और इसे GSON के साथ पंजीकृत कर सकते हैं।

class UserActionDeserializer implements JsonDeserializer<UserAction> { 
    public UserAction deserialize(JsonElement json, Type typeOfT, 
     JsonDeserializationContext context) throws JsonParseException { 
     return new UserAction(UUID.fromString(json.getAsString()); 
} 

GsonBuilder gson = new GsonBuilder(); 
gson.registerTypeAdapter(UserAction.class, new UserActionDeserializer()); 

ध्यान रखें कि इस कोड का परीक्षण नहीं किया गया है।

+0

मैं इसे बाहर की जाँच कर रहा हूँ अब, टिप के लिए धन्यवाद। – frail

0
gson.registerTypeAdapter(DateTime.class, new DateTimeDeserializer()); 

private class DateTimeDeserializer implements JsonDeserializer<DateTime> { 
    public DateTime deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) 
     throws JsonParseException { 
    return new DateTime(json.getAsJsonPrimitive().getAsString()); 
    } 
} 
+10

[कॉपी और पेस्ट] (http://sites.google.com/site/gson/gson-user-guide#TOC- लेखन-an-Instance- निर्माता)। थोड़ा लंगड़ा यह तुम मुझसे पूछो;) –

10

इस समस्या को हल करने के लिए एक और दृष्टिकोण इस तथ्य का लाभ लेने के कि अक्रमांकन दौरान Gson कोई भी मान JSON में पाया नए मूल्यों के साथ कंस्ट्रक्टर्स द्वारा निर्धारित पीटना होगा होगा, और तो बस जो विशेष रूप से मौजूद है एक InstanceCreator उपयोग करते हैं, "एक वर्ग के उदाहरण बनाने के लिए जो नो-एर्ग कन्स्ट्रक्टर को परिभाषित नहीं करता है।" यह दृष्टिकोण विशेष रूप से अच्छी तरह से काम करता है जब कन्स्ट्रक्टर का उपयोग किया जाना केवल फ़ील्ड को पैरामीटर मान निर्दिष्ट करता है, और कोई वैधता जांच नहीं करता है या अन्यथा कोई सार्थक राज्य-आधारित प्रसंस्करण नहीं करता है।

इसके अलावा, इस दृष्टिकोण को और अधिक कस्टम deserialization की आवश्यकता नहीं है - JsonDeserializer का कोई कस्टम कार्यान्वयन आवश्यक नहीं है। यह उन परिस्थितियों के लिए फायदेमंद हो सकता है जहां एक छोटे से मुद्दे को हल करने के लिए एक कस्टम deserializer शुरू करने के बाद निकटतम निकटता में अन्य JSON तत्वों की "मैनुअल" प्रसंस्करण की आवश्यकता होती है, जो गैर-तुच्छ हो सकता है।

इसके साथ, यह एक ऐसा कामकाजी समाधान है जो पसंदीदा UserAction कन्स्ट्रक्टर का उपयोग करता है, लेकिन इसे केवल एक शून्य संदर्भ पास करता है। जेएसओएन से वास्तविक मूल्य बाद में सेट किया गया है। (Gson परवाह नहीं है कि uuid क्षेत्र अंतिम माना जाता है।)

import java.lang.reflect.Type; 
import java.util.UUID; 

import com.google.gson.Gson; 
import com.google.gson.GsonBuilder; 
import com.google.gson.InstanceCreator; 

public class Foo 
{ 
    public static void main(String[] args) 
    { 
    UserAction action = new UserAction(UUID.randomUUID()); 
    action.setUserId("user1"); 

    String json = new Gson().toJson(action); 
    System.out.println(json); 

    GsonBuilder gsonBuilder = new GsonBuilder(); 
    gsonBuilder.registerTypeAdapter(UserAction.class, new UserActionInstanceCreator()); 
    Gson gson = gsonBuilder.create(); 
    UserAction actionCopy = gson.fromJson(json, UserAction.class); 
    System.out.println(gson.toJson(actionCopy)); 
    } 
} 

class UserActionInstanceCreator implements InstanceCreator<UserAction> 
{ 
    @Override 
    public UserAction createInstance(Type type) 
    { 
    return new UserAction(null); 
    } 
} 

class UserAction 
{ 
    private final UUID uuid; 
    private String userId; 

    public UserAction() 
    { 
    throw new RuntimeException("this constructor is not used"); 
    } 

    public UserAction(UUID uuid) 
    { 
    this.uuid = uuid; 
    } 

    void setUserId(String userId) 
    { 
    this.userId = userId; 
    } 
} 
+0

अच्छा तरीका, धन्यवाद – frail

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