JsonProperty
返回的DefaultContractResolver.CreateProperty
类有两个关于转换器的属性,Converter
和MemberConverter
。我没有找到关于它们的足够解释,那么它们之间的区别是什么?什么时候使用?在合同解析器中设置什么属性? <{3}}中的“获取或设置成员转换器”没有帮助。
答案 0 :(得分:3)
NS.Json似乎支持可覆盖的转换器;可能这是因为每个单独的属性都不必指定JsonConverter,但如果需要,它们可以覆盖它。
提示可以在来源中找到:
来自DefaultContractResolver.cs,第1254行:
private void SetPropertySettingsFromAttributes(JsonProperty property, object attributeProvider, string name, Type declaringType, MemberSerialization memberSerialization, out bool allowNonPublicAccess)
{
...
// resolve converter for property
// the class type might have a converter but the property converter takes presidence
property.Converter = JsonTypeReflector.GetJsonConverter(attributeProvider);
property.MemberConverter = JsonTypeReflector.GetJsonConverter(attributeProvider);
来自JsonSerializerInternalReader.cs, line 348:
private JsonConverter GetConverter(JsonContract contract, JsonConverter memberConverter, JsonContainerContract containerContract, JsonProperty containerProperty)
{
JsonConverter converter = null;
if (memberConverter != null)
{
// member attribute converter
converter = memberConverter;
}
else if (containerProperty != null && containerProperty.ItemConverter != null)
{
converter = containerProperty.ItemConverter;
}
else if (containerContract != null && containerContract.ItemConverter != null)
{
converter = containerContract.ItemConverter;
}
else if (contract != null)
{
JsonConverter matchingConverter;
if (contract.Converter != null)
// class attribute converter
converter = contract.Converter;
else if ((matchingConverter = Serializer.GetMatchingConverter(contract.UnderlyingType)) != null)
// passed in converters
converter = matchingConverter;
else if (contract.InternalConverter != null)
// internally specified converter
converter = contract.InternalConverter;
}
return converter;
}
答案 1 :(得分:2)
我已在此处github.com/JamesNK/Newtonsoft.Json/issues/363打开了有关此文档的问题。
但它们之间的一个明显区别(从源代码中可以明显看出)是Converter仅在序列化时使用,而仅在反序列化时使用MemberConverter。我不知道这是不是完整的故事,而且命名确实很多。