使用Newtonsoft JsonConvert对简单类进行序列化和反序列化

时间:2018-09-15 10:35:21

标签: c# json asp.net-web-api asp.net-core

我正在尝试使用JsonConvert.SerializeObject(obj)和JsonConvert.DeserializeObject(string)简单地序列化和反序列化一个简单的类。

我在自定义TypeConverter中将其用于.NET Web API Core 2.1中的QueryParameter。

但是我的行为很奇怪。我的课看起来像这样:

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。“

我试图删除可为空的字段(用常规原语替换它们),但结果却导致了完全相同的错误。

奇怪的是,如果我提供与正文相同的类,那么它会起作用。据我所知,Web API Core还使用Newtonsoft Json Parser。

1 个答案:

答案 0 :(得分:0)

我不知道为什么需要这样做,但是当我将[JsonObject]放在班上时,它突然起作用了。 异常实际上告诉我要这样做,但是我不明白为什么在这种情况下不使用任何文档时为什么有必要这样做。

因此,基本上可以通过以下方法解决问题:

[JsonObject]
public class ListRequestDto {
    public bool? WithCreator { get; set; }
    public int? Skip { get; set; }
    public int? Limit { get; set; }
}