当成员在使用 JsonConvert 反序列化时出现两次时如何引发异常



我有包含重复成员的JSON:

[
{
"MyProperty": "MyProperty1",
"MyProperty": "MyWrongProperty1",
"MyProperty2": "MyProperty12",
"MyProperty2": "MyWrongProperty2"
},
{
"MyProperty": "MyProperty21",
"MyProperty2": "MyProperty22"
}
]

当我反序列化时,它正在获取最后一个属性。这是代码:

var myJson = File.ReadAllText("1.txt");
List<MyClass> myClasses = JsonConvert.DeserializeObject<List<MyClass>>(myJson);

但是当 JSON 字符串包含重复的属性时,我需要抛出异常。我该怎么做?

您需要在JsonLoadSettings中添加DuplicatePropertyNameHandling = DuplicatePropertyNameHandling.Error

您可以在此答案之后深入了解详细信息。

还有一个来自Newtonsoft.json的线程涵盖了这个主题。

您可以使用Newtonsoft.Json中的JsonTextReader来获取所有PropertyName的令牌,然后可能使用 LINQGroupBy()

string json = "[
{
"MyProperty": "MyProperty1",
"MyProperty": "MyWrongProperty1",
"MyProperty2": "MyProperty12",
"MyProperty2": "MyWrongProperty2"
},
{
"MyProperty": "MyProperty21",
"MyProperty2": "MyProperty22"
}
]";
List<string> props = new List<string>();
JsonTextReader reader = new JsonTextReader(new StringReader(json));
while (reader.Read())
{
if (reader.Value != null && reader.TokenType == "PropertyName")
{
props.Add(reader.Value);
}
}

现在使用列表中的GroupBy()查看重复项

var data = props.GroupBy(x => x).Select(x => new 
{
PropName = x.Key,
Occurence = x.Count()
}).Where(y => y.Occurence > 1).ToList();
If (data.Any())
{
Throw New Exception("Duplicate Property Found");
}

JsonConvert.DeserializeObject 在旧版本中具有该功能,但他们将其删除。 为了提供替代方案,他们在 JsonLoadSettings 中添加了一个新选项 - DuplicatePropertyNameHandling - 允许您设置所需的行为。

给你:

public object DeserializeObject(string json)
{
using (var stringReader = new StringReader(json))
using (var jsonReader = new JsonTextReader(stringReader))
{
return JToken.ReadFrom(jsonReader, 
new JsonLoadSettings{ DuplicatePropertyNameHandling = DuplicatePropertyNameHandling.Error })
.ToObject<object>();
}
}

最新更新