जीएसओएन - तिथि प्रारूप


187

मैं Gson आउटपुट में एक कस्टम दिनांक प्रारूप होने की कोशिश कर रहा हूं, लेकिन .setDateFormat(DateFormat.FULL)यह काम नहीं करता है और इसके साथ भी ऐसा ही है .registerTypeAdapter(Date.class, new DateSerializer())

यह ऐसा है जैसे Gson को ऑब्जेक्ट "दिनांक" की परवाह नहीं है और इसे अपने तरीके से प्रिंट करता है।

मैं उसे कैसे बदल सकता हूं?

धन्यवाद

संपादित करें:

@Entity
public class AdviceSheet {
  public Date lastModif;
[...]
}

public void method {
   Gson gson = new GsonBuilder().setDateFormat(DateFormat.LONG).create();
   System.out.println(gson.toJson(adviceSheet);
}

मैं हमेशा उपयोग करता हूं java.util.Date; setDateFormat()काम नहीं करता है :(


क्या आपने जाँच की है कि आप सभी स्थानों पर सही दिनांक-वर्ग आयात कर रहे हैं? साथ ही कोड उदाहरण सहायक होगा।
ML

तुम क्या मतलब नहीं है काम नहीं करता है? आप वास्तव में क्या देखते हैं?
एलिकएल्ज़िन-किलाका

जवाबों:


306

ऐसा लगता है कि आपको दिनांक और समय दोनों भाग के लिए स्वरूपों को परिभाषित करने या स्ट्रिंग-आधारित स्वरूपण का उपयोग करने की आवश्यकता है। उदाहरण के लिए:

Gson gson = new GsonBuilder()
   .setDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz").create();

या java.text.DateFormat का उपयोग कर

Gson gson = new GsonBuilder()
   .setDateFormat(DateFormat.FULL, DateFormat.FULL).create();

या धारावाहिकों के साथ करते हैं:

मेरा मानना ​​है कि फ़ॉर्मेटर्स टाइमस्टैम्प का उत्पादन नहीं कर सकते हैं, लेकिन यह धारावाहिक / deserializer-pair काम करने लगता है

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

JsonDeserializer<Date> deser = 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, ser)
   .registerTypeAdapter(Date.class, deser).create();

यदि जावा 8 या इसके बाद के संस्करण का उपयोग करना चाहिए, तो आपको उपरोक्त धारावाहिकों / deserializers का उपयोग करना चाहिए:

JsonSerializer<Date> ser = (src, typeOfSrc, context) -> src == null ? null
            : new JsonPrimitive(src.getTime());

JsonDeserializer<Date> deser = (jSon, typeOfT, context) -> jSon == null ? null : new Date(jSon.getAsLong());

ठीक है यह आपके रास्ते में बेहतर काम करता है। लेकिन मैं इसके साथ टाइमस्टैम्प कैसे प्रदर्शित कर सकता हूं?
स्टीफन पीटर

6
मैं Gson 2.2.4 का उपयोग कर रहा हूं और Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();काम करता हूं ।
रामशरण

Gson का उपयोग 2.2.2 और Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();काम करता है
user2601995

66
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ").create();

उपरोक्त प्रारूप मुझे बेहतर लगता है क्योंकि इसमें मिली तक सटीक है।


1
@ आभा - 'जेड' को क्यों उद्धृत करना आवश्यक है?
tj-recess

1
मैंने बिना उद्धरणों के कोशिश की और जीसस ने अपवाद को फेंक दिया कि तारीख पारगम्य नहीं है। क्या यह बिना उद्धरण के आपके लिए काम करता है?
अभि

7
ThIs सही समाधान नहीं है .. Z का मतलब टाइमज़ोन है और यह UTC
टाइमज़ोन का

5

जैसा कि एमएल ने बताया, JsonSerializer यहाँ काम करता है। हालाँकि, यदि आप डेटाबेस एंटिटीज़ को फॉर्मेट कर रहे हैं, तो java.sql.Date का उपयोग करें ताकि आप सीरीकेज़र पंजीकृत कर सकें। Deserializer की जरूरत नहीं है।

Gson gson = new GsonBuilder()
   .registerTypeAdapter(java.sql.Date.class, ser).create();

यह बग रिपोर्ट संबंधित हो सकती है: http://code.google.com/p/google-gson/issues/detail?id=230 । हालांकि मैं संस्करण 1.7.2 का उपयोग करता हूं।


4

यदि आप आंतरिक कक्षाओं से घृणा करते हैं, तो कार्यात्मक इंटरफ़ेस का लाभ उठाकर आप जावा 8 में लंबोदर अभिव्यक्ति के साथ कम कोड लिख सकते हैं ।

JsonDeserializer<Date> dateJsonDeserializer = 
     (json, typeOfT, context) -> json == null ? null : new Date(json.getAsLong());
Gson gson = new GsonBuilder().registerTypeAdapter(Date.class,dateJsonDeserializer).create();

ऐसा लगता है कि अशक्त जाँच को छोड़ा जा सकता है (Gson it will it):Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, (JsonDeserializer) (json, typeOfT, context) -> new Date(json.getAsLong())).create();
gmk57

0

यह वास्तव में बिल्कुल काम नहीं करेगा। JSON में कोई दिनांक प्रकार नहीं है। मैं ISO8601 को आगे और पीछे (प्रारूप एग्नोस्टिक्स और जेएस कम्पेटर्स के लिए) क्रमबद्ध करने की सिफारिश करूंगा। विचार करें कि आपको यह जानना होगा कि किन क्षेत्रों में दिनांक हैं।


0

आप Gson gson = builder.setDateFormat("yyyy-MM-dd").create(); इस विधि में प्रारूप निर्दिष्ट कर सकते हैं इसके बजाय yyyy-MM-ddआप किसी भी प्रारूप का उपयोग कर सकते हैं

 GsonBuilder builder = new GsonBuilder();
                        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.setDateFormat("yyyy-MM-dd").create();

0

यह एक बग है । वर्तमान में आपको या तो एक सेट करना होगा timeStyleया अन्य उत्तरों में वर्णित विकल्पों में से किसी एक का उपयोग करना होगा।


0

मैं गन्स 2.8.6 पर हूं और आज इस बग की खोज की।

मेरा दृष्टिकोण हमारे सभी मौजूदा ग्राहकों (मोबाइल / वेब / इत्यादि) को कामकाज जारी रखने की अनुमति देता है, लेकिन 24h प्रारूपों का उपयोग करने वालों के लिए कुछ हैंडलिंग जोड़ता है और मिली को भी, अच्छे उपाय के लिए अनुमति देता है।

Gson rawGson = new Gson();
SimpleDateFormat fmt = new SimpleDateFormat("MMM d, yyyy HH:mm:ss")
private class DateDeserializer implements JsonDeserializer<Date> {
    @Override
    public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
            throws JsonParseException {
        try {
            return new rawGson.fromJson(json, Date.class);
        } catch (JsonSyntaxException e) {}
        String timeString = json.getAsString();
        log.warning("Standard date deserialization didn't work:" + timeString);
        try {
            return fmt.parse(timeString);
        } catch (ParseException e) {}
        log.warning("Parsing as json 24 didn't work:" + timeString);
        return new Date(json.getAsLong());
    }
}

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

मैंने सीरियलाइजेशन को वैसा ही रखा, जैसा कि सभी क्लाइंट स्टैंडर्ड जोंस डेट फॉर्मेट को समझते हैं।

आमतौर पर, मुझे नहीं लगता कि कोशिशों / पकड़ने वाले ब्लॉकों का उपयोग करना अच्छा है, लेकिन यह काफी दुर्लभ मामला होना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.