Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google云端点:当响应包含DateTime字段时Android客户端中的NumberFormatException_Android_Google App Engine_Google Api Java Client_Google Cloud Endpoints_Google Api Client - Fatal编程技术网

Google云端点:当响应包含DateTime字段时Android客户端中的NumberFormatException

Google云端点:当响应包含DateTime字段时Android客户端中的NumberFormatException,android,google-app-engine,google-api-java-client,google-cloud-endpoints,google-api-client,Android,Google App Engine,Google Api Java Client,Google Cloud Endpoints,Google Api Client,我只是从谷歌云端点开始, 我用Python构建了一个API,甚至在Android Studio/Gradle环境中使用了生成的源代码 我面临的问题是,每当来自云端点的响应包含DateTime对象时,就会抛出NumberFormatException 08-05 13:27:28.143 32116-32141/com.dgt.ds E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1 java.lang.RuntimeException

我只是从谷歌云端点开始, 我用Python构建了一个API,甚至在Android Studio/Gradle环境中使用了生成的源代码

我面临的问题是,每当来自云端点的响应包含DateTime对象时,就会抛出NumberFormatException

08-05 13:27:28.143  32116-32141/com.dgt.ds E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
        java.lang.RuntimeException: An error occured while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:299)
        at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
        at java.util.concurrent.FutureTask.run(FutureTask.java:137)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
        at java.lang.Thread.run(Thread.java:856)
        Caused by: java.lang.IllegalArgumentException:  [key created_at, field private com.google.api.client.util.DateTime com.google.api.services.dsApi.model.ServicesDResponse.createdAt]
        at com.google.api.client.json.JsonParser.parseValue(JsonParser.java:797)
        at com.google.api.client.json.JsonParser.parse(JsonParser.java:438)
        at com.google.api.client.json.JsonParser.parseValue(JsonParser.java:745)
        at com.google.api.client.json.JsonParser.parse(JsonParser.java:358)
        at com.google.api.client.json.JsonParser.parse(JsonParser.java:331)
        at com.google.api.client.json.JsonObjectParser.parseAndClose(JsonObjectParser.java:87)
        at com.google.api.client.json.JsonObjectParser.parseAndClose(JsonObjectParser.java:81)
        at com.google.api.client.http.HttpResponse.parseAs(HttpResponse.java:459)
        at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:460)
        at com.dgt.ds.MainActivity$1.doInBackground(MainActivity.java:70)
        at com.dgt.ds.MainActivity$1.doInBackground(MainActivity.java:58)
        at android.os.AsyncTask$2.call(AsyncTask.java:287)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
        ... 5 more
        Caused by: java.lang.NumberFormatException: Invalid date/time format: 2013-08-05T10:27:27.449810
        at com.google.api.client.util.DateTime.parseRfc3339(DateTime.java:301)
        at com.google.api.client.util.Data.parsePrimitiveValue(Data.java:435)
        at com.google.api.client.json.JsonParser.parseValue(JsonParser.java:795)
        ... 17 more
这是Python中的消息对象(我使用的是
消息类型.DateTimeField
):


如何修复此问题?

这是由于本机
datetime.datetime
对象上的
protorpc.protojson.protojson.encode\u字段是
isoformat
所致

这将使用微秒而不是毫秒(因为Python中的
datetime
模块使用微秒),因此,这会使Java客户机库解析器失败

对于短期修复,您可以做以下两件事之一:

  • 停止使用
    DateTimeField
    ,只需使用
    IntegerField
    ,依靠客户端将时间戳作为整数发送即可

  • Monkey patch
    protorpc/protojson.py
    来引用行为正确的
    protojson
    的子类。本质上,不应该使用
    isoformat()
    ,应该使用小数点后只有3位的混合型

这是由于
protorpc.protojson.protojson.encode_字段
在本机
datetime.datetime
对象上是
isoformat
造成的

这将使用微秒而不是毫秒(因为Python中的
datetime
模块使用微秒),因此,这会使Java客户机库解析器失败

对于短期修复,您可以做以下两件事之一:

  • 停止使用
    DateTimeField
    ,只需使用
    IntegerField
    ,依靠客户端将时间戳作为整数发送即可

  • Monkey patch
    protorpc/protojson.py
    来引用行为正确的
    protojson
    的子类。本质上,不应该使用
    isoformat()
    ,应该使用小数点后只有3位的混合型


它可能是在
DateTimeField
的实现方式或Java客户端库中的一个bug。对于同一个请求,JSON负载是什么样子的?您可以访问应用程序的API资源管理器进行测试,网址为
https://yourappid.appspot.com/_ah/api/explorer
@bossylobster这看起来是一个正确的JSON响应,DateTime字段是
“创建于”:“2013-08-05T10:27:27.449000”
谢谢,我会做更多的挖掘,问题是Python标记在小数点后有6位,Java库要求正好是3位。这似乎是一个bug,但我不确定在哪里。它可能是在
DateTimeField
的实现方式或Java客户端库中的bug。对于同一个请求,JSON负载是什么样子的?您可以访问应用程序的API资源管理器进行测试,网址为
https://yourappid.appspot.com/_ah/api/explorer
@bossylobster这看起来是一个正确的JSON响应,DateTime字段是
“创建于”:“2013-08-05T10:27:27.449000”
谢谢,我会做更多的挖掘,问题是Python标记在小数点后有6位,Java库要求正好是3位。这似乎是一个bug,但我不确定在哪里。我到处都在寻找解决方案,除了你的建议之外,找不到其他的。使用
datetime.replace(微秒=0)
也失败。
protorpc/protojson.py
现在应该修复了吗?我认为不需要补丁。我仍然存在当前SDK的错误,我认为SDK不会影响服务器端错误。很抱歉,我不再在谷歌工作了,所以除了我最初的答案之外,我帮不了什么忙。SDK的问题是服务器以错误的方式序列化数据。我到处搜索,想找到一个解决方案,除了你建议的以外,找不到其他解决方案。使用
datetime.replace(微秒=0)
也失败。
protorpc/protojson.py
现在应该修复了吗?我认为不需要补丁。我仍然存在当前SDK的错误,我认为SDK不会影响服务器端错误。很抱歉,我不再在谷歌工作了,所以除了我最初的回答之外,我帮不了什么忙。SDK的问题是服务器以错误的方式序列化数据。
class DResponse(messages.Message):
    id = messages.StringField(1)
    created_at = message_types.DateTimeField(2)
    author = messages.StringField(3)
    description = messages.StringField(4, required=True)