【问题标题】:Newtonsoft.Json skip invalid objects, continue deserializingNewtonsoft.Json 跳过无效对象,继续反序列化
【发布时间】:2020-02-28 12:09:20
【问题描述】:

如何在 Newtonsoft JSON 中跳过/忽略/处理无效的 json 对象?

假设我们有这样的字符串:

[{
    "$id": "xc1",
    "sdfdsgds0sdfsadgdxc,sfgsagdfgdsfdm",
    "gxcgdfs"
}, {
    "$id": "2",
    "Property1": "Value",
    "Property2": "Value2"
}]

在做的时候

JsonConvert.DeserializeObject<T>(jsonString);

所以第一个对象无效,但我想读取第二个有效对象,但出现 JsonReaderException,有没有办法实现忽略/跳过数组中的无效对象并进一步反序列化?

【问题讨论】:

  • 这能回答你的问题吗stackoverflow.com/questions/26107656/…
  • 第一种方法也将问题冒泡收集,因此整个收集为空。
  • 当 JSON 本身是 malformed 时并不容易(在您的情况下就是这种情况),而不仅仅是对当前的反序列化目标无效。 JsonTextReader 是一个维护当前令牌类型和一组有效转换的状态机,如果 JSON 令牌流不符合 JSON standard,解析器将不知道接下来会发生什么。 (在您的情况下,有一个属性名称但没有值)。在这种情况下继续前进会成为问题。

标签: c# json json.net deserialization


【解决方案1】:

我在获取序列化 JSON 字符串时使用 JsonSerializerSettings 类来确定错误。

var settings = new JsonSerializerSettings
{
    Error = (obj, args) =>
    {
        var contextErrors = args.ErrorContext;
        contextErrors.Handled = true;
    }
};
var result = streamReader.ReadToEnd();
List<ViewModel> viewModel = JsonConvert.DeserializeObject<List<viewModel>>(result, settings);

【讨论】:

  • 这会将集合设置为空,它不会得到第二个项目。
  • 您已经为常量 JSON 对象创建了视图模型。就我而言,我的模型是 public class ViewModel { public string Property1 { get;放; } 公共字符串 Property2 { 获取;放;如果没有找到提到的属性,那么这些属性将被排除在外。
  • 对象甚至不会被创建。第一个对象将抛出 2 个错误,一个为无效对象,第二个为收集,但我看不到继续反序列化的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-02
  • 1970-01-01
  • 2017-06-23
  • 1970-01-01
  • 1970-01-01
  • 2013-08-16
  • 1970-01-01
相关资源
最近更新 更多