如果您已经将 JSON 解析为JToken
层次结构,您可以使用JToken.ToObject<T>(JsonSerializer) http://www.newtonsoft.com/json/help/html/M_Newtonsoft_Json_Linq_JToken_ToObject__1_1.htm使用转换器反序列化为您想要的类型:
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 反序列化分为两个阶段,string
⇒ JToken
⇒ MyType
,那么日期字符串和小数可能会过早地被解析和识别。您可能需要在最初解析 JSON 时指定适当的设置和/或延迟日期识别,如下所示:
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 而不需要中间过程时JToken
表示,序列化器可以将“提示”传递给JsonTextReader https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_JsonTextReader.htm分词器确定是否应将某些原始标记解释为日期、小数或其他内容ReadType https://github.com/JamesNK/Newtonsoft.Json/blob/master/Src/Newtonsoft.Json/JsonTextReader.cs#L37枚举。然而,枚举是 Newtonsoft 内部的。)
更多关于DateTime
解析见在 JSON 中序列化日期 https://www.newtonsoft.com/json/help/html/DatesInJSON.htm。小提琴样本here https://dotnetfiddle.net/ReJWvE.