【发布时间】:2014-02-27 17:17:57
【问题描述】:
在 .NET 领域,我有一个像这样定义的泛型类..
public class SyncWrapper<T, I>
{
public IList<T> Data { get; set; }
public IList<I> DeleteIds { get; set; }
public DateTime LastSyncDateTime { get; set; }
}
我可以通过简单地调用...从 json 创建这个对象的一个实例
JsonConvert.DeserializeObject<SyncWrapper<T, Guid>>(json);
现在我的任务是将此代码移植到 Java/Android。以前从未接触过 Java,我还有很多东西要学!
无论如何,到目前为止,我已经尝试过 Gson 和 Jackson 从 json 获取对象,但没有任何乐趣。我认为我将无法使用涉及的<T> 与gson.fromJson(json, SyncWrapper<T, UUID>.class) 调用andthing,因为类型Erasure 有问题!
到目前为止,我的努力看起来是这样的......
Gson
Gson gson = new Gson();
SyncWrapper<MyClass, UUID> result = gson.fromJson(json, new TypeToken<SyncWrapper<MyClass, UUID>>() { }.getType());
这会编译,但结果是一个空的 SyncWrapper
杰克逊
ObjectMapper mapper = new ObjectMapper();
SyncWrapper<MyClass, UUID> result = mapper.readValue(json, new TypeReference<SyncWrapper<MyClass, UUID>>() { });
这会编译,但在执行时会导致应用崩溃!!!
我的 Java 版本的 SyncWrapper....
public class SyncWrapper<T, I> {
private DateTime lastSyncDateTime;
private Collection<T> data;
private Collection<I> deleteIds;
public Collection<T> getData() {
return data;
}
public void setData(Collection<T> data) {
this.data = data;
}
public Collection<I> getDeleteIds() {
return deleteIds;
}
public void setDeleteIds(Collection<I> deleteIds) {
this.deleteIds = deleteIds;
}
public DateTime getLastSyncDateTime() {
return lastSyncDateTime;
}
public void setLastSyncDateTime(DateTime lastSyncDateTime) {
this.lastSyncDateTime = lastSyncDateTime;
}
}
我真的被强大的力量深深地投入了(所有编程都是一样的,不是吗?),所以非常感谢任何帮助。
我并不在乎我使用哪个库(Gson、Jackson 等)
更新
要反序列化的Json示例...
{
"Data": [
{
"Name": "Company A",
"Id": "7d5d236c-c2b5-42dc-aea5-99e6752c8a52"
},
{
"Name": "Company B",
"Id": "44444444-0000-0000-0000-444444444444"
},
{
"Name": "Company C",
"Id": "249a4558-05c6-483f-9835-0056804791c9"
}
],
"DeleteIds": [
"5f7873a6-b2ee-4566-9714-1577b81384f4",
"1f224a39-16c3-441d-99de-8e58fa8f31c2"
],
"LastSyncDateTime": "\/Date(1393580073773+0000)\/"
}
..或者这个(DeleteIds 通常为空)...
{
"Data": [
{
"Name": "Company A",
"Id": "7d5d236c-c2b5-42dc-aea5-99e6752c8a52"
},
{
"Name": "Company B",
"Id": "44444444-0000-0000-0000-444444444444"
},
{
"Name": "Company C",
"Id": "249a4558-05c6-483f-9835-0056804791c9"
}
],
"DeleteIds": null,
"LastSyncDateTime": "\/Date(1393580073773+0000)\/"
}
对于上面的 json,我将映射到一个 SyncWrapper,其中 T 是 Company...
public class Company extends ModelBase {
private String name;
public Company(UUID id, String name) {
super(id);
setName(name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
【问题讨论】:
-
没有看到您的 JSON 样本,这是无法回答的。您展示的 Gson 和 Jackson sn-ps 非常好......但似乎 JSON 不匹配(我猜测的一个问题是尝试使用
UUID类) -
@BrianRoach - 感谢您的评论,我已经更新了问题以显示一些 json 和一个要
编辑的示例类。您认为可能是 UUID 的什么问题?