ASP.NET 核心 1.1.0 字典的归零值<string,object>
ASP.NET Core 1.1.0 nulling values of Dictionary<string,object>
我有一个 ASP.NET WebAPI 核心 1.1.0 应用程序,当 returned 给调用者时,它没有正确序列化我的响应。我有一个带有 属性 的对象,它是一个 Dictionary<string,object>
,当响应被 return 发送给调用者时,Payload
字典中的值被清零。
对象:
ResponseObject {
string ID {get; set;}
DateTime Date {get; set;}
Dictionary<string,object> Payload {get; set;}
...
}
控制器:
[HttpPost]
public async Task<ResponseObject> Post([FromBody] ResponseObject request) {
// Object here is deserialized correctly.
// Do work
ResponseObject response = ...
// Object here has values in the Payload
return response;
}
当请求进入应用程序时,它被正确反序列化为 ResponseObject
,应用程序会进行一些处理,然后 return 该对象以修改后的形式返回。 Payload
字典中的键可以更改名称和编号。当 ResponseObject
即将 return 时,我可以在调试中看到数据在 Payload
字典中。一旦调试器离开控制器的 return
并发回给调用者,字典值就是空的。
基于此,我可以假设在 return 之后 ResponseObject
的序列化过程中 ASP.NET 核心应用程序中发生了问题。我不想更改默认的序列化程序,因为应用程序中的其他所有内容都按预期工作。我知道使用 Json.NET 对 ResponseObject
进行反序列化和序列化是有效的,因为该应用程序在应用程序的其他部分可以完美地完成它。我唯一能想到的是默认的 WebAPI 序列化程序使用不同的选项或者是不同的实现。
我错过了什么?我可以为序列化程序设置一个选项来显示值吗?或者我必须更改默认的序列化程序吗?还是有其他我没有看到的解决方案?
我知道你说过你不想使用 Json.NET。相反,您可以尝试以下方法
return Json(response);
我最终将控制器上的 return 类型更改为字符串并自己直接序列化对象。这样我就可以控制序列化的完成方式,而不必依赖 WebAPI 的魔术豆来帮我完成。它不是最理想的解决方案,也不是我想要的,但它确实有效。生成的有效控制器如下:
[HttpPost]
public async Task<string> Post([FromBody] ResponseObject request) {
// Do work
ResponseObject response = ...
// I am using Jil here, but you could also use Json.NET
return JSON.SerializeDynamic(response);
// return JsonConvert.SerializeObject(response);
}
我有一个 ASP.NET WebAPI 核心 1.1.0 应用程序,当 returned 给调用者时,它没有正确序列化我的响应。我有一个带有 属性 的对象,它是一个 Dictionary<string,object>
,当响应被 return 发送给调用者时,Payload
字典中的值被清零。
对象:
ResponseObject {
string ID {get; set;}
DateTime Date {get; set;}
Dictionary<string,object> Payload {get; set;}
...
}
控制器:
[HttpPost]
public async Task<ResponseObject> Post([FromBody] ResponseObject request) {
// Object here is deserialized correctly.
// Do work
ResponseObject response = ...
// Object here has values in the Payload
return response;
}
当请求进入应用程序时,它被正确反序列化为 ResponseObject
,应用程序会进行一些处理,然后 return 该对象以修改后的形式返回。 Payload
字典中的键可以更改名称和编号。当 ResponseObject
即将 return 时,我可以在调试中看到数据在 Payload
字典中。一旦调试器离开控制器的 return
并发回给调用者,字典值就是空的。
基于此,我可以假设在 return 之后 ResponseObject
的序列化过程中 ASP.NET 核心应用程序中发生了问题。我不想更改默认的序列化程序,因为应用程序中的其他所有内容都按预期工作。我知道使用 Json.NET 对 ResponseObject
进行反序列化和序列化是有效的,因为该应用程序在应用程序的其他部分可以完美地完成它。我唯一能想到的是默认的 WebAPI 序列化程序使用不同的选项或者是不同的实现。
我错过了什么?我可以为序列化程序设置一个选项来显示值吗?或者我必须更改默认的序列化程序吗?还是有其他我没有看到的解决方案?
我知道你说过你不想使用 Json.NET。相反,您可以尝试以下方法
return Json(response);
我最终将控制器上的 return 类型更改为字符串并自己直接序列化对象。这样我就可以控制序列化的完成方式,而不必依赖 WebAPI 的魔术豆来帮我完成。它不是最理想的解决方案,也不是我想要的,但它确实有效。生成的有效控制器如下:
[HttpPost]
public async Task<string> Post([FromBody] ResponseObject request) {
// Do work
ResponseObject response = ...
// I am using Jil here, but you could also use Json.NET
return JSON.SerializeDynamic(response);
// return JsonConvert.SerializeObject(response);
}