使用JsonConvert.DeserializeObject,如何警告缺少成员,但继续反序列化?
Using JsonConvert.DeserializeObject, how to warn about missing members, but continue deserializing?
我正在使用 JsonConvert.DeserializeObject
反序列化一些对象。 json 文件中的属性可能不存在于相应的定义中。发生这种情况时,我想基本上忽略该字段并继续反序列化,但会在控制台中打印一条警告,指出该字段丢失。
DeserializeObject
的文档显示可以给出一个额外的 JsonSerializerSettings
参数,其中包含一个 MissingMemberHandling 设置。但是,可用于该设置的两个选项是 Ignore
和 Error
。前者默默地忽略缺失的字段并继续,后者停止反序列化并抛出错误。我似乎需要介于这两者之间的东西。
我在这里看到了类似的问题Detect if deserialized object is missing a field with the JsonConvert class in Json.NET。但是,在这道题中,原来的post是想让反序列化器抛出一个错误,停止反序列化。我希望它继续,但只是通知用户字段不匹配。有办法吗?
你可以这样做:
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System;
namespace NewtonsoftJsonSample
{
public static class Program
{
public static void Main(string[] args)
{
var json = "{'name': 'john', 'age': 45, 'city': 'Bristol'}".Replace("'", "\"");
// remember to set an error handler and to raise an error each time a member is missing
// during deserialization
var settings = new JsonSerializerSettings
{
Error = OnError,
MissingMemberHandling = MissingMemberHandling.Error
};
var deserialized = JsonConvert.DeserializeObject<Character>(json, settings);
Console.WriteLine("Deserialized object: {0}", deserialized);
Console.ReadLine();
static void OnError(object sender, ErrorEventArgs args)
{
Console.WriteLine("Unable to find member '{0}' on object of type {1}", args.ErrorContext.Member, args.ErrorContext.OriginalObject.GetType().Name);
// set the current error as handled
args.ErrorContext.Handled = true;
}
}
}
public class Character
{
public string Name { get; set; }
public override string ToString()
{
return $"Name: {this.Name}";
}
}
}
基本上你需要同时使用 MissingMemberHandling
and Error
properties of JsonSerializerSettings
class.
我正在使用 JsonConvert.DeserializeObject
反序列化一些对象。 json 文件中的属性可能不存在于相应的定义中。发生这种情况时,我想基本上忽略该字段并继续反序列化,但会在控制台中打印一条警告,指出该字段丢失。
DeserializeObject
的文档显示可以给出一个额外的 JsonSerializerSettings
参数,其中包含一个 MissingMemberHandling 设置。但是,可用于该设置的两个选项是 Ignore
和 Error
。前者默默地忽略缺失的字段并继续,后者停止反序列化并抛出错误。我似乎需要介于这两者之间的东西。
我在这里看到了类似的问题Detect if deserialized object is missing a field with the JsonConvert class in Json.NET。但是,在这道题中,原来的post是想让反序列化器抛出一个错误,停止反序列化。我希望它继续,但只是通知用户字段不匹配。有办法吗?
你可以这样做:
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System;
namespace NewtonsoftJsonSample
{
public static class Program
{
public static void Main(string[] args)
{
var json = "{'name': 'john', 'age': 45, 'city': 'Bristol'}".Replace("'", "\"");
// remember to set an error handler and to raise an error each time a member is missing
// during deserialization
var settings = new JsonSerializerSettings
{
Error = OnError,
MissingMemberHandling = MissingMemberHandling.Error
};
var deserialized = JsonConvert.DeserializeObject<Character>(json, settings);
Console.WriteLine("Deserialized object: {0}", deserialized);
Console.ReadLine();
static void OnError(object sender, ErrorEventArgs args)
{
Console.WriteLine("Unable to find member '{0}' on object of type {1}", args.ErrorContext.Member, args.ErrorContext.OriginalObject.GetType().Name);
// set the current error as handled
args.ErrorContext.Handled = true;
}
}
}
public class Character
{
public string Name { get; set; }
public override string ToString()
{
return $"Name: {this.Name}";
}
}
}
基本上你需要同时使用 MissingMemberHandling
and Error
properties of JsonSerializerSettings
class.