【问题标题】:Using Newtonsoft JsonConvert to serialize and deserialize simple class使用Newtonsoft JsonConvert对简单类进行序列化和反序列化
【发布时间】: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


【解决方案1】:

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

所以基本上做以下解决了这个问题:

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

【讨论】:

  • 如果你有一个自定义的 TypeConverter 应用到你的类,Json.Net 将尝试使用它进行序列化和反序列化。在序列化时,这将产生一个字符串值(无论 TypeConverter 返回什么字符串),而在反序列化时,它会期望 JSON 包含一个字符串值,因为它想使用 TypeConverter 将其转回一个对象(因此你的错误看)。使用 [JsonObject] 属性告诉 Json.Net 您希望将其序列化/反序列化为常规对象,而不是使用 TypeConverter。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多