gpt4 book ai didi

java - JSON - 使用 Gson 反序列化客户端类

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:11:28 24 4
gpt4 key购买 nike

我在使用 Google Gson 反序列化类时遇到问题。这个问题困扰了我几天,我找不到解决办法。

我创建了一个简单的测试用例,这是我的类的最小工作子集:

import java.util.Date;

import com.google.api.client.util.DateTime;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class Test {
public static void main(String[] args) {

GsonBuilder builder = new GsonBuilder();

Gson gson = builder.create();

DateTest dt = new DateTest(new Date());
String j1 = gson.toJson(dt);
System.out.println(j1);
DateTest dt2 = gson.fromJson(j1, DateTest.class);
System.out.println(dt2);

}

static class DateTest {
@com.google.api.client.util.Key
private final DateTime date;

public DateTest(Date dt) {
this.date = new DateTime(dt);
}

@Override
public String toString() {
return date.toString();
}
}
}

这会产生所需的输出。

序列化为: {“日期”:{“值”:1381503448717,“dateOnly”:假,“tzShift”:60}}反序列化回: 2013-10-11T15:57:28.717+01:00

但是,我尝试序列化的类是使用“生成云端点客户端库”从 Google App Engine 类自动生成的(这意味着我不能/不愿意修改它,而且该类可以序列化/反序列化为带有我在类路径中的 jar 的 JSON - 请参阅 https://developers.google.com/appengine/docs/java/endpoints/consume_android )。

经过大量测试后,我发现问题出在自动生成的类“extends com.google.api.client.json.GenericJson”——如果您将代码更改为:

static class DateTest extends com.google.api.client.json.GenericJson{

序列化成功(输出相同)但反序列化失败:

Exception in thread "main" java.lang.ClassCastException: Cannot cast java.util.LinkedHashMap to Test$DateTest
at java.lang.Class.cast(Unknown Source)
at com.google.gson.Gson.fromJson(Gson.java:643)
at Test.main(Test.java:17)

Android 似乎给出了更详细的输出,问题是任何非基本类属性都失败了。

我的问题是 - 如何修改我的反序列化代码以使反序列化成功?我做错了什么?

由于我的项目能够从网络反序列化相同的 JSON 对象,请注意我不会接受任何关于“尝试使用另一个 JSON 库”的回答。

最佳答案

经过一个周末的谷歌代码挖掘,我发现以下代码解决了我的问题:

public static void main(String[] args) {

GsonFactory factory= new GsonFactory();

DateTest dt = new DateTest(new Date());
String j1 = factory.toString(dt);
System.out.println(j1);
DateTest dt2 = factory.fromString(j1, DateTest.class);
System.out.println(dt2);

}

希望这会在未来帮助其他人。

关于java - JSON - 使用 Gson 反序列化客户端类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19321610/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com