C# 反序列化JSON将值转换为特定类型时出错

C# 反序列化JSON将值转换为特定类型时出错,c#,json,serialization,json.net,C#,Json,Serialization,Json.net,我有一个Django后端模型,带有创建JSON的REST服务。我得到的JSON(部分)如下所示: [ { "id": 1, "username": "T1", "tel": "", "created_on": "2018-09-03T16:29:20.903315Z", "last_login": null, "hasContacts": [ ], "myChanges": [ ], "helpsOnChan

我有一个Django后端模型,带有创建JSON的REST服务。我得到的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]。帮助对象”,第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;
        }
公共静态异步任务getDataListFromService(字符串查询字符串)
{
Debug.WriteLine(“####为”+queryString构建HttpClient);
HttpClient=新的HttpClient();
Debug.WriteLine(“构建GetAsync…”);
HttpResponseMessage response=wait client.GetAsync(queryString);
Debug.WriteLine(“####HTTP Get Response:“+Response.ReasonPhrase”);
列表数据=null;
if(响应。IsSuccessStatusCode)
{
字符串json=response.Content.ReadAsStringAsync().Result;
Debug.WriteLine(“####JSON结果:“+JSON”);
ITraceWriter=新的MemoryTraceWriter();
JsonSerializerSettings设置=新的JsonSerializerSettings
{
TraceWriter=writer
};
尝试
{
data=JsonConvert.DeserializeObject(json,设置);
}
catch(System.Exception-ex)
{
Debug.WriteLine(“###异常”+ex.Message);
Debug.WriteLine(“跟踪结果:+writer”);
}
}
返回数据;
}

如您所想,您应该使用自定义的
IReferenceResolver

你在评论中问到如何使用多种类型。您可以使用找到的解析器代码来执行此操作。此链接包括一个完整示例:


所以我把德普挖了进去。我目前正在寻找的是最好的策略:1。自定义IReferenceResolver:这真的对我的任务有帮助吗?我见过一个在然而这个“唯一”似乎工作的一种类型,而我有3个不同的。。?2.编写一个完全自定义的JSON呈现程序,由谁解析示例。。?3.重写后端以始终序列化一个类,然后为子类调用REST服务。。。4.其他选择?使用类似的工具将使您的生活更加轻松。谢谢您的帮助!:)