2011-04-15 14 views
72

समस्या के समाधान के लिए 4 घंटे नॉन-स्टॉप के बाद मैंने यह पूछने का फैसला किया है कि कोई मेरी मदद कर सकता है या नहीं।"अतुलनीय तिथि: 1302828677828" जीसन के साथ deserialize करने की कोशिश कर रहा है सर्वर से प्राप्त मिलीसेकंड-प्रारूप दिनांक

समस्या यह है कि मेरे एंड्रॉइड क्लाइंट सर्वर से प्राप्त डेटा को deserialize करने की कोशिश करता है "अविभाज्य: 1302828677828" अपवाद फेंक देते हैं।

मैं जानना चाहता हूं कि जीसन का उपयोग करके मिलीसेकंड-प्रारूप दिनांक को deserialize करना संभव है या नहीं।

+0

क्या दिनांक/समय इस प्रतिनिधित्व करने के लिए माना जाता है? – Squonk

+0

क्या आप इसे 'लम्बे' के रूप में नहीं पा सकते हैं, और उसके बाद अपने कोड में 'लंबी' को 'दिनांक'' में प्रोग्रामेटिक रूप से परिवर्तित कर सकते हैं? – aroth

+11

अंततः मुझे समाधान मिला: \t // जेसन ऑब्जेक्ट बनाता है जो प्राप्त जानकारी का प्रबंधन करेगा \t GsonBuilder builder = new GsonBuilder(); \t // लंबे मूल्यों builder.registerTypeAdapter (Date.class, नई JsonDeserializer () { सार्वजनिक तिथि deserialize (JsonElement json, प्रकार typeOfT, JsonDeserializationContext संदर्भ) फेंकता JsonParseException { के रूप में की तारीख प्रकारों को प्रबंधित करने के लिए एडॉप्टर रजिस्टर \t नई तारीख लौटें (json.getAsJsonPrimitive()। GetAsLong()); } }); जीसन जीसन = builder.create(); – Alfonso

उत्तर

129

अलफोंसो की टिप्पणी:

अंत में मैं समाधान मिल गया:

// Creates the json object which will manage the information received 
GsonBuilder builder = new GsonBuilder(); 

// Register an adapter to manage the date types as long values 
builder.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() { 
    public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
     return new Date(json.getAsJsonPrimitive().getAsLong()); 
    } 
}); 

Gson gson = builder.create(); 
+2

यह तब काम नहीं करता जब तिथियां दोनों प्रारूपों में हों। –

+0

आपको बहुत धन्यवाद, आपने अपना समय बचाया !! –

+0

धन्यवाद, यह बहुत अच्छा जवाब है –

0

जब मैं Android annotations पुस्तकालय की Rest client साथ दिनांक समय क्षेत्र deserialize करने की कोशिश की मैं एक ही समस्या है। एक समाधान के रूप में मैं कस्टम GsonHttpMessageConverter

public class CustomGsonHttpMessageConverter extends GsonHttpMessageConverter { 

    public CustomGsonHttpMessageConverter() { 
     // Creates the json object which will manage the information received 
     GsonBuilder builder = new GsonBuilder(); 

     // Register an adapter to manage the date types as long values 
     builder.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() { 
      public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
       return new Date(json.getAsJsonPrimitive().getAsLong()); 
      } 
     }); 

     setGson(builder.create()); 
    } 
} 

बनाया है और बाकी ग्राहक

@Rest(rootUrl = "http://192.168.1.1:8080", converters = {CustomGsonHttpMessageConverter.class}) 
public interface RestClient extends RestClientErrorHandling { 
... 

मुझे आशा है कि यह उपयोगी होगा में परिभाषित किया है

0

मैं एक ImprovedDateTypeAdapter GSON डिफ़ॉल्ट DateTypeAdapter के आधार पर लिखा था जो डिफ़ॉल्ट दिनांक प्रारूप और टाइमस्टैम्प (लंबा) प्रारूप का समर्थन करता है।

import com.google.gson.Gson; 
import com.google.gson.JsonSyntaxException; 
import com.google.gson.TypeAdapter; 
import com.google.gson.TypeAdapterFactory; 
import com.google.gson.reflect.TypeToken; 
import com.google.gson.stream.JsonReader; 
import com.google.gson.stream.JsonToken; 
import com.google.gson.stream.JsonWriter; 

import java.io.IOException; 
import java.text.DateFormat; 
import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.Locale; 
import java.util.TimeZone; 

public final class ImprovedDateTypeAdapter extends TypeAdapter<Date> { 

    public static final TypeAdapterFactory FACTORY = new TypeAdapterFactory() { 

     public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) { 

      @SuppressWarnings("unchecked") 
      TypeAdapter<T> typeAdapter = (TypeAdapter<T>) ((typeToken.getRawType() == Date.class) ? new ImprovedDateTypeAdapter() 
        : null); 
      return typeAdapter; 
     } 
    }; 
    private final DateFormat enUsFormat; 
    private final DateFormat localFormat; 
    private final DateFormat iso8601Format; 

    public ImprovedDateTypeAdapter() { 
     this.enUsFormat = DateFormat.getDateTimeInstance(2, 2, Locale.US); 

     this.localFormat = DateFormat.getDateTimeInstance(2, 2); 

     this.iso8601Format = buildIso8601Format(); 
    } 

    private static DateFormat buildIso8601Format() { 
     DateFormat iso8601Format = new SimpleDateFormat(
       "yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US); 
     iso8601Format.setTimeZone(TimeZone.getTimeZone("UTC")); 
     return iso8601Format; 
    } 

    public Date read(JsonReader in) throws IOException { 
     if (in.peek() == JsonToken.NULL) { 
      in.nextNull(); 
      return null; 
     } 
     return deserializeToDate(in.nextString()); 
    } 

    private synchronized Date deserializeToDate(String json) { 
     try { 

      return new Date(Long.parseLong(json)); 
     } catch (Exception e) { 

      try { 

       return this.localFormat.parse(json); 
      } catch (ParseException e1) { 

       try { 

        return this.enUsFormat.parse(json); 
       } catch (ParseException e2) { 

        try { 

         return this.iso8601Format.parse(json); 
        } catch (ParseException e3) { 

         throw new JsonSyntaxException(json, e3); 
        } 
       } 
      } 
     } 
    } 

    public synchronized void write(JsonWriter out, Date value) 
      throws IOException { 
     if (value == null) { 
      out.nullValue(); 
      return; 
     } 
     String dateFormatAsString = this.enUsFormat.format(value); 
     out.value(dateFormatAsString); 
    } 
} 

इसका इस्तेमाल करने के लिए:

// Creates the json object which will manage the information received 
GsonBuilder builder = new GsonBuilder(); 

// Register an adapter to manage the date types as long values 
builder.registerTypeAdapter(Date.class, new ImprovedDateTypeAdapter()); 

Gson gson = builder.create();