【发布时间】:2018-09-02 19:24:15
【问题描述】:
我有一个带有创建 JSON 的 REST 服务的 Django 后端模型。我得到的 JSON(部分)如下所示:
[
{
"id": 1,
"username": "T1",
"tel": "",
"created_on": "2018-09-03T16:29:20.903315Z",
"last_login": null,
"hasContacts": [
],
"myChanges": [
],
"helpsOnChanges": [
],
"shouldHelpOnChanges": [
1
],
"welldone_set": [
{
"id": 1,
"created_on": "2018-09-03T16:29:20.925327Z",
"comment": "You rock1",
"change": 1,
"helper": 1
}
]
},
{
"id": 2,
"username": "T2",
"tel": "",
"created_on": "2018-09-03T16:29:20.903315Z",
"last_login": null,
"hasContacts": [
],
"myChanges": [
{
"id": 1,
"name": "Stop smoking",
"created_on": "2018-09-03T16:29:20.923315Z",
"change": "I want to stop smoking",
"finished_on": null,
"success": false,
"helpee": 2,
"helper": [
],
"requestedHelpers": [
1
],
"welldone_set": [
{
"id": 1,
"created_on": "2018-09-03T16:29:20.925327Z",
"comment": "You rock1",
"change": 1,
"helper": 1
}
]
}
],
"helpsOnChanges": [
],
"shouldHelpOnChanges": [
],
"welldone_set": [
]
}
]
现在 JSONConvert.Deserialize 调用的显式错误是:
2018-09-02T18:57:13.145 反序列化 App.ViewModels.Change 时出错。将值 1 转换为类型“App.ViewModels.User”时出错。路径“[0].myChanges[0].helpee”,第 1 行,位置 275。
这是指“helpee”属性,它是用户类型。 Django 框架只将用户的 id 放在这个列表中,这是有道理的,因为在上面的结果之前,用户已经在这个 JSON 中传输了。
那么为什么 Newtonsoft.JSON 不能解决这个问题呢?不能将此 id 与同一 id 的实际用户实例相关联吗?
提前感谢您! 狼
编辑:为了澄清我的 Django 后端的序列化程序:
class ChangeSerializer(serializers.ModelSerializer):
welldone_set = WellDoneSerializer(many=True)
class Meta:
model = Change
fields = ('id',
'name',
'created_on',
'change',
'finished_on',
'success',
'helpee',
'helper',
'requestedHelpers',
'welldone_set')
ChangeSerializer.helpee = UserSerializer();
ChangeSerializer.helper = UserSerializer(many=True);
ChangeSerializer.requestedHelpers = UserSerializer(many=True);
如您所见,helpee 实际上是一个对象而不仅仅是一个 id
编辑 2:将 json 更新为完整
编辑 3:我的反序列化方法。在反序列化器行中抛出异常。
public static async Task<List<T>> getDataListFromService<T>(string queryString)
{
Debug.WriteLine("###Building HttpClient for " + queryString);
HttpClient client = new HttpClient();
Debug.WriteLine("###Building GetAsync...");
HttpResponseMessage response = await client.GetAsync(queryString);
Debug.WriteLine("### HTTP Get Response: " + response.ReasonPhrase);
List<T> data = null;
if (response.IsSuccessStatusCode)
{
string json = response.Content.ReadAsStringAsync().Result;
Debug.WriteLine("### JSON REsult: " + json);
ITraceWriter writer = new MemoryTraceWriter();
JsonSerializerSettings settings = new JsonSerializerSettings
{
TraceWriter = writer
};
try
{
data = JsonConvert.DeserializeObject<List<T>>(json, settings);
}
catch (System.Exception ex)
{
Debug.WriteLine("### Exception " + ex.Message);
Debug.WriteLine("### Trace Results: " + writer);
}
}
return data;
}
【问题讨论】:
-
所以我把 depper 挖进去了。我目前正在寻找的是最好的策略: 1. 自定义 IReferenceResolver:这真的对我的任务有帮助吗?我在stackoverflow.com/questions/38964774/… 看到过那个,但是这个“仅”似乎适用于一种类型,而我有 3 种不同的类型..? 2. 写一个完全自定义的JSON Renderer,由谁解析示例..? 3. 将后端重写为只序列化一个类,然后为子类调用 REST 服务... 4. 其他替代方案?
-
使用像QuickType 这样的工具会让你的生活变得更轻松。
标签: c# json serialization json.net