错误输入字符串

时间:2017-08-06 01:32:38

标签: json exception xstream

我正在使用xStream来获取一些JSON。多年来我一直广泛使用xstream。不过这个问题让我很难过。

我收到以下ConversionException ...

com.thoughtworks.xstream.converters.ConversionException: For input string: ".232017E.232017E44"
---- Debugging information ----
message             : For input string: ".232017E.232017E44"
cause-exception     : java.lang.NumberFormatException
cause-message       : For input string: ".232017E.232017E44"
class               : java.sql.Timestamp
required-type       : java.sql.Timestamp
converter-type      : com.etepstudios.xstream.XStreamTimestampConverter
line number         : -1
class[1]            : com.pbp.bookacall.dataobjects.AppleReceipt
converter-type[1]   : com.thoughtworks.xstream.converters.reflection.ReflectionConverter
class[2]            : com.pbp.bookacall.dataobjects.AppleReceiptCollection
version             : 1.4.10
-------------------------------
at com.etepstudios.xstream.XStreamTimestampConverter.unmarshal(XStreamTimestampConverter.java:87)

在我的XStreamTimestampConverter类中,我打印出试图转换的值。结果证明是以下内容......

XStreamTimestampConverter value = 2017-08-05 23:44:23.GMT

这是我的转换器中的unmarshal功能...

public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) 
{
    Timestamp theTimestamp;
    Date theDate;

    String value = reader.getValue ();

    try 
    {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.Z");

        theDate = formatter.parse(value);

        theTimestamp = new Timestamp (theDate.getTime());
    } 
    catch (Exception e) 
    {
        System.out.println ("XStreamTimestampConverter value = " + value);

        throw new ConversionException(e.getMessage(), e);
    }

    return theTimestamp;
}

知道这个奇怪的字符串来自哪里?它在我的JSON中不存在。 xstream是否有一些奇数。[num] E. [num] E [num]表示什么?每次运行时,这些数字都会发生变化。我也得到一个For输入字符串:“”。然而,价值与上面的相似。这就像它在某个地方随机获得奇数值。

数据源来自Apple的In-App Purchase / VerifyReceipt网络电话。系统工作一段时间很好,但其他人则没有。同样重要的是要注意,在这种情况下,它使用此转换器解析了100个其他日期/时间戳字符串。它只是让人感到困惑。也许是由于数据的大小?

1 个答案:

答案 0 :(得分:0)

所以我弄清楚这里发生了什么。上面的unmarshal函数并不像我在代码中那样......

SimpleDateFormat格式化程序实际上是在类中而不是在unmarshal方法中设置的。因此,如果Xstream持有我的转换器的实例并且跨多个线程调用unmarshal,那么格式化程序可能会因为它是同一个对象而感到困惑。

这是我唯一的猜测,因为将格式化程序初始化移动到方法中解决了这个问题。我会说SimpleDateFormatter不是线程安全的吗?

只是数据的纯粹性以及同时被调用的次数暴露了这个问题。如果发生这种情况,只需给别人一个提示。