我正在尝试使用 Json.NET 反序列化一些 JSON 对象。然而,我发现,当我反序列化一个没有我要查找的属性的对象时,不会引发任何错误,但是当我访问它们时会为这些属性返回一个默认值。当我反序列化错误类型的对象时,我能够检测到这一点很重要。示例代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
namespace Json_Fail_Test
{
class Program
{
[JsonObject(MemberSerialization.OptOut)]
private class MyJsonObjView
{
[JsonProperty("MyJsonInt")]
public int MyJsonInt { get; set; }
}
const string correctData = @"
{
'MyJsonInt': 42
}";
const string wrongData = @"
{
'SomeOtherProperty': 'fbe8c20b'
}";
static void Main(string[] args)
{
var goodObj = JsonConvert.DeserializeObject<MyJsonObjView>(correctData);
System.Console.Out.WriteLine(goodObj.MyJsonInt.ToString());
var badObj = JsonConvert.DeserializeObject<MyJsonObjView>(wrongData);
System.Console.Out.WriteLine(badObj.MyJsonInt.ToString());
}
}
}
这个程序的输出是: 42 0
我宁愿抛出异常而不是静默失败。除此之外,有没有办法检测序列化是否找不到参数?
我知道我可以使用 Json 对象解析数据,然后使用键值查找检查参数,但我所在的代码库使用上面的模式,如果可能的话,我希望保持一致。
最佳答案
Json.Net 序列化程序有一个 MissingMemberHandling
设置,您可以将其设置为 Error
。 (默认为 Ignore
。)这将导致序列化程序在反序列化过程中遇到目标类中没有对应属性的 JSON 属性时抛出 JsonSerializationException
。
static void Main(string[] args)
{
try
{
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.MissingMemberHandling = MissingMemberHandling.Error;
var goodObj = JsonConvert.DeserializeObject<MyJsonObjView>(correctData, settings);
System.Console.Out.WriteLine(goodObj.MyJsonInt.ToString());
var badObj = JsonConvert.DeserializeObject<MyJsonObjView>(wrongData, settings);
System.Console.Out.WriteLine(badObj.MyJsonInt.ToString());
}
catch (Exception ex)
{
Console.WriteLine(ex.GetType().Name + ": " + ex.Message);
}
}
结果:
42
JsonSerializationException: Could not find member 'SomeOtherProperty' on object
of type 'MyJsonObjView'. Path 'SomeOtherProperty', line 3, position 33.
见:MissingMemberHandling setting .
https://stackoverflow.com/questions/21030712/
相关文章:
json - 是否为 null 有效 JSON(4 字节,仅此而已)
php - 如何在预先存在的 SQL 数据库之上使用 Elastic Search?
xml - 为什么人们希望将 Json 和 XML 作为输出传递到他们的 REST 接口(inter
json - Swift 中对象的自动 JSON 序列化和反序列化
json - IE9 JSON 数据 "do you want to open or save th
wcf - DataContractJsonSerializer 和枚举
javascript - 如何让 AngularJS 输出转义 HTML