【发布时间】:2018-09-15 10:35:20
【问题描述】:
我正在尝试使用 JsonConvert.SerializeObject(obj) 和 JsonConvert.DeserializeObject(string) 简单地序列化和反序列化一个简单的类。
我在 .NET Web API Core 2.1 的 QueryParameter 的自定义 TypeConverter 中使用它。
但我的行为很奇怪。我的班级是这样的:
public class ListRequestDto {
public bool? WithCreator { get; set; }
public int? Skip { get; set; }
public int? Limit { get; set; }
}
我正在尝试执行以下操作:
var test = new ListRequestDto {
WithCreator = true,
Skip = 0,
Limit = 15
};
string ttt = JsonConvert.SerializeObject(test);
但我得到以下输出:
"MyNameSpace.ListRequestDto"
如果我反过来尝试:
string json = "{ WithCreator: true, Skip: 0, Limit: 15 }";
JsonConvert.DeserializeObject<ListRequestDto>(json);
我得到以下异常:
Newtonsoft.Json.JsonSerializationException:“无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型 'MyNameSpace.ListRequestDto',因为该类型需要 JSON 字符串值才能正确反序列化。 要修复此错误,请将 JSON 更改为 JSON 字符串值或将反序列化类型更改为可以反序列化的普通 .NET 类型(例如,不是整数等原始类型,而不是数组或列表等集合类型)来自 JSON 对象。 JsonObjectAttribute 也可以添加到类型中以强制它从 JSON 对象反序列化。 路径‘跳过’,第 1 行,位置 8。”
我尝试删除可为空的字段(用常规原语替换它们),但这导致了完全相同的错误。
奇怪的是,如果我提供与 body 相同的类,它就可以工作。据我所知,Web API Core 也使用 Newtonsoft Json Parser。
【问题讨论】:
-
我尝试了您的代码进行序列化,它运行良好。您在哪里看到“MyNameSpace.ListRequestDto”?你确定这就是你在
ttt中得到的吗? -
对于反序列化,您忘记了引号:
{"WithCreator":true,"Skip":0,"Limit":15} -
实际上,我试过不带引号,效果也很好。
标签: c# json asp.net-web-api asp.net-core