2014-08-27 6 views
6

के साथ मैं डेटाबेस में ऑब्जेक्ट्स मैप करने के लिए हाइबरनेट का उपयोग कर रहा हूं। एक ग्राहक (किसी iOS एप्लिकेशन) मेरे JSON प्रारूप में विशेष वस्तुओं जो मैं अपने सच्चे प्रतिनिधित्व करने के लिए परिवर्तित निम्नलिखित उपयोगिता पद्धति का उपयोग करके भेजता हैस्ट्रिंग और बाइट [] के साथ JSON को कनवर्ट करना [] GSON

/** 
    * Convert any json string to a relevant object type 
    * @param jsonString the string to convert 
    * @param classType the class to convert it too 
    * @return the Object created 
    */ 
    public static <T> T getObjectFromJSONString(String jsonString, Class<T> classType) { 

     if(stringEmptyOrNull(jsonString) || classType == null){ 
      throw new IllegalArgumentException("Cannot convert null or empty json to object"); 
     } 

     try(Reader reader = new StringReader(jsonString)){ 
      Gson gson = new GsonBuilder().create(); 
      return gson.fromJson(reader, classType); 
     } catch (IOException e) { 
      Logger.error("Unable to close the reader when getting object as string", e); 
     } 
     return null; 
    } 

मुद्दा तथापि है, मेरी पोगो में मैं के रूप में एक बाइट [मान संग्रहीत कि ] के रूप में नीचे देखा जा सकता है (के रूप में यह है कि क्या डेटाबेस में संग्रहीत किया जाता है - एक ब्लॉब)

@Entity 
@Table(name = "PersonalCard") 
public class PersonalCard implements Card{ 

    @Id @GeneratedValue 
    @Column(name = "id") 
    private int id; 

    @OneToOne 
    @JoinColumn(name="userid") 
    private int userid; 

    @Column(name = "homephonenumber") 
    protected String homeContactNumber; 

    @Column(name = "mobilephonenumber") 
    protected String mobileContactNumber; 

    @Column(name = "photo") 
    private byte[] optionalImage; 

    @Column(name = "address") 
    private String address; 

अब जाहिर है, रूपांतरण में विफल रहता है, क्योंकि यह एक बाइट [] और एक स्ट्रिंग के बीच परिवर्तित नहीं कर सकते।

एक बाइट सरणी के बजाय स्ट्रिंग को स्वीकार करने के लिए कन्स्ट्रक्टर को बदलने के लिए यहां सबसे अच्छा तरीका है और फिर बाइट सरणी मान सेट करते समय स्वयं रूपांतरण करें या ऐसा करने के लिए एक बेहतर तरीका है।

फेंक दिया गया त्रुटि निम्नानुसार है;

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: उम्मीद BEGIN_ARRAY लेकिन था STRING लाइन 1 कॉलम 96 पथ पर $ .optionalImage

धन्यवाद

संपादित असल में मैंने जिस दृष्टिकोण का सुझाव दिया वह भी काम नहीं करेगा जिस तरह से जीएसओएन वस्तु उत्पन्न करता है।

+0

समस्या क्या है में बाइट [] वापस जाने के लिए? क्या आप जेसन प्रारूप का उपयोग करके बाइट सरणी को क्रमबद्ध/deserialize नहीं कर सकते? और क्या? – Andremoniy

+0

मुझे जेसन के रूप में एक वस्तु प्राप्त हो रही है और इसे सीधे मेरे हाइबरनेट pojo में परिवर्तित कर रहा है। हाइबरनेट pojo बाइट सरणी प्रारूप में काम करता है। जीएसओएन लाइब्रेरी स्ट्रिंग को ऑब्जेक्ट में परिवर्तित करती है और बाइट को परिवर्तित करने में विफल होने लगती है [] – Biscuit128

+0

असफल होने में त्रुटि क्या है? – Andremoniy

उत्तर

11

आप बेस 0 में बाइट एरे को क्रमबद्ध और deserialize करने के लिए इस adapter का उपयोग कर सकते हैं। यहां सामग्री है।

public static final Gson customGson = new GsonBuilder().registerTypeHierarchyAdapter(byte[].class, 
      new ByteArrayToBase64TypeAdapter()).create(); 

    // Using Android's base64 libraries. This can be replaced with any base64 library. 
    private static class ByteArrayToBase64TypeAdapter implements JsonSerializer<byte[]>, JsonDeserializer<byte[]> { 
     public byte[] deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
      return Base64.decode(json.getAsString(), Base64.NO_WRAP); 
     } 

     public JsonElement serialize(byte[] src, Type typeOfSrc, JsonSerializationContext context) { 
      return new JsonPrimitive(Base64.encodeToString(src, Base64.NO_WRAP)); 
     } 
    } 

लेखक को क्रेडिट Ori Peleg

+1

मेरे पास हैश मैप <स्ट्रिंग, बाइट []> - यह एडाप्टर के साथ सही काम नहीं करता है - मुझे जावा ऑब्जेक्ट संदर्भ मिलता है और लक्ष्य बेस 64 मान नहीं। कोई विचार? –

2

भविष्य के संदर्भ के लिए कुछ ब्लॉग से, लिंक उपलब्ध नहीं है, कम से कम उपयोगकर्ता यहां संदर्भित कर सकते हैं।

import com.google.gson.Gson; 
import com.google.gson.GsonBuilder; 
import com.google.gson.JsonDeserializationContext; 
import com.google.gson.JsonDeserializer; 
import com.google.gson.JsonElement; 
import com.google.gson.JsonParseException; 
import com.google.gson.JsonPrimitive; 
import com.google.gson.JsonSerializationContext; 
import com.google.gson.JsonSerializer; 

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

public class GsonHelper { 
    public static final Gson customGson = new GsonBuilder() 
      .registerTypeAdapter(Date.class, new JsonDeserializer<Date>() { 
       @Override 
       public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
       return new Date(json.getAsLong()); 
       } 
      }) 
      .registerTypeHierarchyAdapter(byte[].class, 
        new ByteArrayToBase64TypeAdapter()).create(); 

    // Using Android's base64 libraries. This can be replaced with any base64 library. 
    private static class ByteArrayToBase64TypeAdapter implements JsonSerializer<byte[]>, JsonDeserializer<byte[]> { 
     public byte[] deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
      return Base64.decode(json.getAsString(), Base64.NO_WRAP); 
     } 

     public JsonElement serialize(byte[] src, Type typeOfSrc, JsonSerializationContext context) { 
      return new JsonPrimitive(Base64.encodeToString(src, Base64.NO_WRAP)); 
     } 
    } 
} 
0

आप बस POJO में स्ट्रिंग के रूप में तस्वीर ले जा सकते हैं, और सेटर विधि परिवर्तित स्ट्रिंग में [] बाइट और मनुष्य विधि

@Entity 
@Table(name = "PersonalCard") 
public class PersonalCard implements Card 
{ 

    @Id @GeneratedValue 
    @Column(name = "id") 
    private int id; 

    @OneToOne 
    @JoinColumn(name="userid") 
    private int userid; 

    @Column(name = "homephonenumber") 
    protected String homeContactNumber; 

    @Column(name = "mobilephonenumber") 
    protected String mobileContactNumber; 

    @Column(name = "photo") 
    private byte[] optionalImage; 

    @Column(name = "address") 
    private String address; 

    @Column 
    byte[] optionalImage; 

    public byte[] getOptionalImage() 
    { 
     return optionalImage; 
    } 

    public void setOptionalImage(String s) 
    { 
     this.optionalImage= s.getBytes(); 
    } 
} 
+0

आशा है कि यह मदद करेगा .... –

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