"अप्राप्य तिथि: 1302828677828" Gson के साथ सर्वर से मिलिसेकंड-फॉरमेट की तारीख को डिसअर्सलाइज़ करने की कोशिश कर रहा है


80

4 घंटे तक नॉन-स्टॉप समस्या को हल करने की कोशिश के बाद मैंने यहां पूछने का फैसला किया है कि क्या कोई मेरी मदद कर सकता है।

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

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


यह किस दिनांक / समय का प्रतिनिधित्व करने वाला है?
स्कवॉन्च

तुम सिर्फ एक के रूप में यह पार्स नहीं कर सकता long, और उसके बाद प्रोग्राम के रूप में परिवर्तित longएक करने के लिए Dateअपने कोड में?
Aroth

11
अंत में मुझे इसका हल मिल गया: // json ऑब्जेक्ट बनाता है जो प्राप्त की गई जानकारी को प्रबंधित करेगा GsonBuilder बिल्डर = new GsonBuilder (); // लॉन्ग वैल्यू बिल्डर के रूप में दिनांक प्रकारों को प्रबंधित करने के लिए एक एडेप्टर रजिस्टर करें ।registerTypeAdapter (Date.class, नया JsonDeserializer <Date>) ({सार्वजनिक दिनांक deserialize (JsonElement json, TypeOfT, JsonDeserializationContext Reference) फेंकता है JsonParseException {नया नया} .getAsJsonPrimitive ()। getAsLong ());}}); Gson gson = buildder.create ();
अल्फांसो

जवाबों:


147

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

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

// 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();

बहुत बहुत धन्यवाद आपने मेरा समय बचाया !!
क्रिस सिम

समयक्षेत्र की समस्याएं
चेरनोएन

धन्यवाद इससे मुझे भी मदद मिली। हालांकि मैंने इसका इस्तेमाल टाइमस्टैम्प के लिए किया था।
फेरू

यह हर तारीख के लिए काम कर रहा है जो कि मिलीसेकंड में पारित हो जाता है, हर तरह की पार्स की गई वस्तुओं के लिए नियम पारित करने के लिए नहीं
Nather Webber

2
.getAsJsonPrimitive()छोड़ा जा सकता है, और जावा 8 Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, (JsonDeserializer) (json, typeOfT, context) -> new Date(json.getAsLong())).create();
लंबो के

2

मैंने 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();

2
JsonSerializer<Date> serializer= new JsonSerializer<Date>() {
  @Override
  public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext 
             context) {
    return src == null ? null : new JsonPrimitive(src.getTime());
  }
};

JsonDeserializer<Date> deserializer= new JsonDeserializer<Date>() {
  @Override
  public Date deserialize(JsonElement json, Type typeOfT,
       JsonDeserializationContext context) throws JsonParseException {
    return json == null ? null : new Date(json.getAsLong());
  }
};

Gson gson = new GsonBuilder()
   .registerTypeAdapter(Date.class, serializer)
   .registerTypeAdapter(Date.class, deserializer).create();

1

JSON को संसाधित करते समय मिलीसेकंड को परिवर्तित करने के लिए नीचे स्निपेट का उपयोग करें।

    GsonBuilder gsonBuilder = new GsonBuilder();
    // Adapter to convert long values to date types
    gsonBuilder.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {
        public Date deserialize(JsonElement jsonElement, Type typeOfObj, JsonDeserializationContext context)
               throws JsonParseException {
                   //Converting milliseconds to current Date. (instead of 1970)
                return new Date(jsonElement.getAsLong() * 1000);
            }
        });
    Gson gson = gsonBuilder.setPrettyPrinting().create();

0

मेरे पास एक ही समस्या है जब मैंने एंड्रॉइड एनोटेशन लाइब्रेरी के रेस्ट क्लाइंट के साथ डेटटाइम फ़ील्ड को डिसेर्बलाइज करने की कोशिश की थी । एक समाधान के रूप में मैंने कस्टम 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

किसी कारण से मुझे अनाम कोड का उपयोग करके उपरोक्त कोड के साथ इंटेलीज में संकलन त्रुटियां थीं; एक मेमने ने मेरे लिए काम किया:

private static Gson buildGson(){
    // Deserialize longs as Dates
    final JsonDeserializer<Date> dateDeserializer = (json, type, context) -> json == null ? null : new Date(json.getAsLong());
    return new GsonBuilder().registerTypeAdapter(Date.class, dateDeserializer).create();
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.