使用自定义SerializerSettings将JToken转换为.NET类型

时间:2019-02-27 14:21:07

标签: .net json json.net

Json.NET将JSON解析与.NET对象的构造分开。特别应该

JsonConvert.DeserializeObject<MyType>(jsonString)

相同
JsonConvert.DeserializeObject<JToken>(jsonString).ToObject<MyType>()

ToObject方法没有带SerializerSettings的参数。那么如何指定JSON转换器和相关设置?

1 个答案:

答案 0 :(得分:1)

如果您已经将JSON解析为JToken层次结构,则可以使用JToken.ToObject<T>(JsonSerializer)使用转换器将其反序列化为所需的类型:

var settings = new JsonSerializerSettings
{
    Converters = { new MyTypeConverter() },
    // Other settings as required.
    DateTimeZoneHandling = DateTimeZoneHandling.Utc, 
};
var myType = jToken.ToObject<MyType>(JsonSerializer.CreateDefault(settings));

请注意,Json.NET在字符串标记化过程中处理DateTime和浮点识别,因此,如果将JSON反序列化分为两个阶段,stringJToken⇒{{1} },则可能会过早地解析和识别日期字符串和小数。最初解析JSON和/或推迟日期识别时,您可能需要指定适当的设置,如下所示:

MyType

(相反,在没有中间var parseSettings = new JsonSerializerSettings { DateParseHandling = DateParseHandling.None, // Defer date/time recognition until later. FloatParseHandling = FloatParseHandling.Decimal, // Or Double if required. }; var jToken = JsonConvert.DeserializeObject<JToken>(jsonString, parseSettings); 表示形式的情况下,直接从字符串反序列化为POCO时,序列化程序可以将“提示”传递给JsonTextReader令牌化程序,以了解是否应解释某些原始令牌日期,小数或使用ReadType枚举的任何形式。因此,枚举是Newtonsoft内部的。)

有关JToken解析的更多信息,请参见 Serializing Dates in JSON 。样本小提琴here