Json.NET将JSON解析与.NET对象的构造分开。特别应该
JsonConvert.DeserializeObject<MyType>(jsonString)
与
相同JsonConvert.DeserializeObject<JToken>(jsonString).ToObject<MyType>()
ToObject
方法没有带SerializerSettings
的参数。那么如何指定JSON转换器和相关设置?
答案 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反序列化分为两个阶段,string
⇒JToken
⇒{{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。