JodaTime LocalDate / LocalTime不使用自定义JSON序列化程序类进行分析 [英] JodaTime LocalDate/LocalTime not Parsing with custom JSON Serializer classes

查看:201
本文介绍了JodaTime LocalDate / LocalTime不使用自定义JSON序列化程序类进行分析的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个名为 ReportEvent 的对象,它包含一个 LocalTime 以及一个 LocalDate 来自 JodaTime API /框架。可以通过谷歌的 GSON ReportEvent 写入 JSON >转换API。然而,当反序​​列化 JodaTime部分会导致问题。



Logcat错误报告:

  10-16 13:23:01.812:E / AndroidRuntime(8884):致命例外:main 
10-16 13:23:01.812:E / AndroidRuntime(8884):java.lang.RuntimeException:无法启动活动ComponentInfo {com.nanospark.cnc / com.nanospark.cnc.MainActivity}:java.lang.IllegalArgumentException:格式无效:{iChronology:{iBase :{iMinDa ...
10-16 13:23:01.812:E / AndroidRuntime(8884):at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
10- 16 13:23:01.812:E / AndroidRuntime(8884):at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
10-16 13:23:01.812:E / AndroidRuntime(8884):at android.app.ActivityThread.access $ 600(ActivityThread.java:141)
10-16 13:23:01.812:E / AndroidRuntime(8884):at android.app.ActivityThread $ H.handleMessage(ActivityThread.java: 1256)
10-16 13:23:01.812:E / A ndroidRuntime(8884):在android.os.Handler.dispatchMessage(Handler.java:99)
10-16 13:23:01.812:E / AndroidRuntime(8884):at android.os.Looper.loop(Looper .java:137)
10-16 13:23:01.812:E / AndroidRuntime(8884):at android.app.ActivityThread.main(ActivityThread.java:5103)
10-16 13:23 :01.812:E / AndroidRuntime(8884):在java.lang.reflect.Method.invokeNative(本地方法)
10-16 13:23:01.812:E / AndroidRuntime(8884):at java.lang.reflect .Method.invoke(Method.java:525)
10-16 13:23:01.812:E / AndroidRuntime(8884):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java: 737)
10-16 13:23:01.812:E / AndroidRuntime(8884):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-16 13: 23:01.812:E / AndroidRuntime(8884):在dalvik.system.NativeStart.main(本地方法)
10-16 13:23:01.812:E / AndroidRuntime(8884):引起:java.lang。 IllegalArgumentException:格式无效:{iChronology:{iBase:{iM inDa ...
10-16 13:23:01.812:E / AndroidRuntime(8884):at org.joda.time.format.DateTimeFormatter.parseLocalDateTime(DateTimeFormatter.java:854)
10- 16 13:23:01.812:E / AndroidRuntime(8884):at org.joda.time.format.DateTimeFormatter.parseLocalDate(DateTimeFormatter.java:798)
10-16 13:23:01.812:E / AndroidRuntime 8884):at com.nanospark.cnc.LocalDateSerializer.deserialize(LocalDateSerializer.java:32)
10-16 13:23:01.812:E / AndroidRuntime(8884):at com.nanospark.cnc.LocalDateSerializer.deserialize (LocalDateSerializer.java:1)
10-16 13:23:01.812:E / AndroidRuntime(8884):at com.google.gson.TreeTypeAdapter.read(TreeTypeAdapter.java:58)
10- 16 13:23:01.812:E / AndroidRuntime(8884):在com.google.gson.internal.bind.ReflectiveTypeAdapterFactory $ 1.read(ReflectiveTypeAdapterFactory.java:95)
10-16 13:23:01.812:E / AndroidRuntime(8884):com.google.gson.internal.bind.ReflectiveTypeAdapterFactory $ Adapter.read(ReflectiveTypeAdapterFactory.java:18 3)
10-16 13:23:01.812:E / AndroidRuntime(8884):com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40)
10-16 13:23:01.812:E / AndroidRuntime(8884):com.google.gson.internal.bind.CollectionTypeAdapterFactory $ Adapter.read(CollectionTypeAdapterFactory.java:81)
10-16 13:23:01.812:E / AndroidRuntime(8884):at com.google.gson.internal.bind.CollectionTypeAdapterFactory $ Adapter.read(CollectionTypeAdapterFactory.java:60)
10-16 13:23:01.812:E / AndroidRuntime(8884):at com.google.gson.Gson.fromJson(Gson.java:805)
10-16 13:23:01.812:E / AndroidRuntime(8884):com.google.gson.Gson.fromJson(Gson.java :770)
10-16 13:23:01.812:E / AndroidRuntime(8884):at com.google.gson.Gson.fromJson(Gson.java:719)
10-16 13:23 :01.812:E / AndroidRuntime(8884):at com.nanospark.cnc.GlobalData.retrieveGlobalDataFromStorage(GlobalData.java:118)
10-16 13:23:01.812:E / AndroidRuntime(8884):at com。 nanosp ark.cnc.MainActivity.onCreate(MainActivity.java:35)
10-16 13:23:01.812:E / AndroidRuntime(8884):at android.app.Activity.performCreate(Activity.java:5133)
10-16 13:23:01.812:E / AndroidRuntime(8884):at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
10-16 13:23:01.812:E / AndroidRuntime (8884):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
10-16 13:23:01.812:E / AndroidRuntime(8884):... 11 more

相关代码段:

LocalTime Serializer / Deserializer。 p>

  package com.nanospark.cnc; 

import java.lang.reflect.Type;

import org.joda.time.LocalTime;
import org.joda.time.format.DateTimeFormatter;
import org.joda.time.format.ISODateTimeFormat;

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;


公共类LocalTimeSerializer实现了JsonDeserializer< LocalTime>,JsonSerializer< LocalTime>
{

private static final DateTimeFormatter TIME_FORMAT = ISODateTimeFormat.timeNoMillis();

@Override
public LocalTime deserialize(final JsonElement je,final Type type,
final JsonDeserializationContext jdc)throws JsonParseException
{
final String dateAsString = je的ToString();
if(je.isJsonNull()|| dateAsString.length()== 0)
{
return null;
}
else
{
return TIME_FORMAT.parseLocalTime(dateAsString);


$ b @Override
public JsonElement serialize(final LocalTime src,final Type typeOfSrc,$ b $ final JsonSerializationContext context)
{
String retVal;
if(src == null)
{
retVal =;
}
else
{
retVal = TIME_FORMAT.print(src);
}
返回新的JsonPrimitive(retVal);

$ b}

LocalDate Serializer / Deserializer。 p>

  public class LocalDateSerializer实现JsonSerializer< LocalDate>,JsonDeserializer< LocalDate> 
{

private static final String PATTERN =yyyy-MM-dd;
final DateTimeFormatter fmt = DateTimeFormat.forPattern(PATTERN);

$ b @Override
public JsonElement serialize(LocalDate src,Type typeOfSrc,JsonSerializationContext context)
{
String retVal = fmt.print(src);
Log.v(我的LOCALDATE SERIALIZED,retVal);
返回新的JsonPrimitive(retVal);


$ b @Override
public LocalDate反序列化(JsonElement json,类型typeOfT,JsonDeserializationContext上下文)
抛出JsonParseException
{

Log.v(MY LOCALDATE DESERIALIZED,json.toString());
return fmt.parseLocalDate(json.toString());
}
}


解决方案

问题在于你的代码是序列化数据。



在你原来的问题中,当你打算反序列化时, em>( retrieveGlobalDataFromStorage ):

 最终GsonBuilder builder = new GsonBuilder )
.registerTypeAdapter(LocalDate.class,new LocalDateSerializer())
.registerTypeAdapter(LocalTime.class,new LocalTimeSerializer());
final Gson gson = builder.create();

但是当你要 serialize 时( storeGlobalData )你只需要:

  Gson gson = new Gson(); 

您应该在两个 位置注册类型适配器。我会将这些代码( Gson 初始化)提取到一个单独的方法,您可以从两个方法中调用该方法。

I have an object called ReportEvent which takes in a LocalTime as well as a LocalDate from the JodaTime API/framework. This ReportEvent is able to be written to JSON via google's GSON conversion API. However when deserializing the JodaTime partial causes problems.

Logcat Error Report:

10-16 13:23:01.812: E/AndroidRuntime(8884): FATAL EXCEPTION: main
10-16 13:23:01.812: E/AndroidRuntime(8884): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.nanospark.cnc/com.nanospark.cnc.MainActivity}: java.lang.IllegalArgumentException: Invalid format: "{"iChronology":{"iBase":{"iMinDa..."
10-16 13:23:01.812: E/AndroidRuntime(8884):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
10-16 13:23:01.812: E/AndroidRuntime(8884):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
10-16 13:23:01.812: E/AndroidRuntime(8884):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
10-16 13:23:01.812: E/AndroidRuntime(8884):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
10-16 13:23:01.812: E/AndroidRuntime(8884):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-16 13:23:01.812: E/AndroidRuntime(8884):     at android.os.Looper.loop(Looper.java:137)
10-16 13:23:01.812: E/AndroidRuntime(8884):     at android.app.ActivityThread.main(ActivityThread.java:5103)
10-16 13:23:01.812: E/AndroidRuntime(8884):     at java.lang.reflect.Method.invokeNative(Native Method)
10-16 13:23:01.812: E/AndroidRuntime(8884):     at java.lang.reflect.Method.invoke(Method.java:525)
10-16 13:23:01.812: E/AndroidRuntime(8884):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
10-16 13:23:01.812: E/AndroidRuntime(8884):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-16 13:23:01.812: E/AndroidRuntime(8884):     at dalvik.system.NativeStart.main(Native Method)
10-16 13:23:01.812: E/AndroidRuntime(8884): Caused by: java.lang.IllegalArgumentException: Invalid format: "{"iChronology":{"iBase":{"iMinDa..."
10-16 13:23:01.812: E/AndroidRuntime(8884):     at org.joda.time.format.DateTimeFormatter.parseLocalDateTime(DateTimeFormatter.java:854)
10-16 13:23:01.812: E/AndroidRuntime(8884):     at org.joda.time.format.DateTimeFormatter.parseLocalDate(DateTimeFormatter.java:798)
10-16 13:23:01.812: E/AndroidRuntime(8884):     at com.nanospark.cnc.LocalDateSerializer.deserialize(LocalDateSerializer.java:32)
10-16 13:23:01.812: E/AndroidRuntime(8884):     at com.nanospark.cnc.LocalDateSerializer.deserialize(LocalDateSerializer.java:1)
10-16 13:23:01.812: E/AndroidRuntime(8884):     at com.google.gson.TreeTypeAdapter.read(TreeTypeAdapter.java:58)
10-16 13:23:01.812: E/AndroidRuntime(8884):     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:95)
10-16 13:23:01.812: E/AndroidRuntime(8884):     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:183)
10-16 13:23:01.812: E/AndroidRuntime(8884):     at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40)
10-16 13:23:01.812: E/AndroidRuntime(8884):     at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:81)
10-16 13:23:01.812: E/AndroidRuntime(8884):     at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:60)
10-16 13:23:01.812: E/AndroidRuntime(8884):     at com.google.gson.Gson.fromJson(Gson.java:805)
10-16 13:23:01.812: E/AndroidRuntime(8884):     at com.google.gson.Gson.fromJson(Gson.java:770)
10-16 13:23:01.812: E/AndroidRuntime(8884):     at com.google.gson.Gson.fromJson(Gson.java:719)
10-16 13:23:01.812: E/AndroidRuntime(8884):     at com.nanospark.cnc.GlobalData.retrieveGlobalDataFromStorage(GlobalData.java:118)
10-16 13:23:01.812: E/AndroidRuntime(8884):     at com.nanospark.cnc.MainActivity.onCreate(MainActivity.java:35)
10-16 13:23:01.812: E/AndroidRuntime(8884):     at android.app.Activity.performCreate(Activity.java:5133)
10-16 13:23:01.812: E/AndroidRuntime(8884):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
10-16 13:23:01.812: E/AndroidRuntime(8884):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
10-16 13:23:01.812: E/AndroidRuntime(8884):     ... 11 more

Relevant sections of code:

LocalTime Serializer/Deserializer.

package com.nanospark.cnc;

import java.lang.reflect.Type;

import org.joda.time.LocalTime;
import org.joda.time.format.DateTimeFormatter;
import org.joda.time.format.ISODateTimeFormat;

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;


public class LocalTimeSerializer implements JsonDeserializer<LocalTime>, JsonSerializer<LocalTime>
{

   private static final DateTimeFormatter TIME_FORMAT = ISODateTimeFormat.timeNoMillis();

   @Override
   public LocalTime deserialize(final JsonElement je, final Type type,
                           final JsonDeserializationContext jdc) throws JsonParseException
   {
      final String dateAsString = je.toString();
      if (je.isJsonNull() || dateAsString.length() == 0)
      {
         return null;
      }
      else
      {
         return TIME_FORMAT.parseLocalTime(dateAsString);         
      }
   }

   @Override
   public JsonElement serialize(final LocalTime src, final Type typeOfSrc,
                                final JsonSerializationContext context)
   {
      String retVal;
      if (src == null)
      {
         retVal = "";
      }
      else
      {
         retVal = TIME_FORMAT.print(src);
      }
      return new JsonPrimitive(retVal);
   }

}

LocalDate Serializer/Deserializer.

public class LocalDateSerializer implements JsonSerializer<LocalDate>, JsonDeserializer<LocalDate>
{

  private static final String PATTERN = "yyyy-MM-dd";
  final DateTimeFormatter fmt = DateTimeFormat.forPattern(PATTERN);


  @Override
  public JsonElement serialize(LocalDate src, Type typeOfSrc, JsonSerializationContext context)
  {
    String retVal = fmt.print(src);
    Log.v("MY LOCALDATE SERIALIZED", retVal);
    return new JsonPrimitive(retVal);
  }


  @Override
  public LocalDate deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
      throws JsonParseException
  {

    Log.v("MY LOCALDATE DESERIALIZED",json.toString());
    return fmt.parseLocalDate(json.toString());
  }
}

解决方案

The problem lies with the code you've got that's serializing the data.

In your original question, you have this code when you're going to deserialize (retrieveGlobalDataFromStorage):

final GsonBuilder builder = new GsonBuilder()
   .registerTypeAdapter(LocalDate.class, new LocalDateSerializer())
   .registerTypeAdapter(LocalTime.class, new LocalTimeSerializer());
final Gson gson = builder.create();  

But when you're going to serialize (storeGlobalData) you just have:

Gson gson = new Gson();

You should be registering the type adapters in both places. I'd extract that code (Gson initialization) to a separate method which you can call from both your methods.

这篇关于JodaTime LocalDate / LocalTime不使用自定义JSON序列化程序类进行分析的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆