我有一个转换器,我只想在反序列化时使用.所以我将CanWrite设置为false,这很好,所有序列化都很好.然后,Json字符串包含一个对象图,其中有一个SantaClauseCollection,其中包含一个SantaClause项目数组和一个$ type,表示它们是具体类型的SantaClause.
然而,当它在反序列化时遇到SantaClaus的集合时,它从不调用CanConvert(我有一个断点并看到SantaClausCollection,点击F5继续,然后当遇到SantaClaus集合中的项目时应该再次达到断点,但它没有).当它到达SantaClaus项目时,它不会尝试调用CanConvert.甚至没有为该项调用CanConvert来检查我的转换器是否会处理它,而是尝试反序列化它本身,这将无法工作,因为该类没有默认构造函数,也没有带有属性名匹配约定的构造函数:
无法找到用于类型SantaClaus的构造函数.一个类应该有一个默认的构造函数,一个带参数的构造函数或一个用JsonConstructor属性标记的构造函数.
我明白为什么会出现这个错误,但问题是它表明Json.net试图反序列化该对象,而不是调用CanConvert检查并查看我的转换器是否想要处理反序列化.
为什么没有为集合中的每个项目调用CanConvert?
我的转换器:
class SantaClaus2JsonConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(SantaClaus);          
    }
    /// <summary>
    /// Deserializes a SantaClaus as a SantaClausEx which has a matching constructor that allows it to deserialize naturally.
    /// </summary>       
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        return serializer.Deserialize<SantaClausEx>(reader);
    }
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, value);
    }
    public override bool CanRead
    {
        get
        { …我有3个班:
class Person {
    public bool IsFemale { get; set; }
}
class Female : Person {
    public string FemaleSpecificProperty { get; set; }
}
class Male: Person { 
    public string MaleSpecificProperty { get; set; }
}
如何根据属性的值将给定的JSON字符串反序列化为特定的实例(Female或Male)Person.IsFemale?(我不知道使用了哪种确切的类型,而且该属性是唯一的指示)
我看着雇用,CustomCreationConverter<T>但无法弄清楚如何使它在这里工作.
我定义了以下类:
<TypeConverter(GetType(ExpandableObjectConverter))>
<DataContract()>
Public Class Vector3
   <DataMember()> Public Property X As Double
   <DataMember()> Public Property Y As Double
   <DataMember()> Public Property Z As Double
   Public Overrides Function ToString() As String
      Return String.Format("({0}, {1}, {2})",
                           Format(X, "0.00"),
                           Format(Y, "0.00"),
                           Format(Z, "0.00"))
   End Function
End Class
使用DataContractJsonSerializer我按预期收到以下JSON:
{
  "Vector": {
    "X": 1.23,
    "Y": 4.56,
    "Z": 7.89
  }
}
但是,JSON.NET产生:
{
  "Vector": "(1.23, 4.56, 7.89)"
}
如果我ExpandableObjectConverter从类中删除该属性,JSON.NET会按预期生成结果(与DataContractJsonSerializer相同).
不幸的是,我需要ExpandableObjectConverter这样,以便该类使用属性网格.
有没有办法告诉JSON.NET忽略ExpandableObjectConverters?
我更喜欢使用JSON.NET,而不是DataContractJsonSerializer因为将枚举序列化为字符串表示更容易.
我尝试过DateTime.MinValue以各种可能的方式反序列化包含的Json字符串,但是当该set方法在我的对象上被调用时。日期总是从-01-01-01-更改为-01-01-02-。
被解析的Json明确包含
"inception_date": "0001-01-01T00:00:00+00:00"
然后JsonConvert,我呼吁:
return JsonConvert.DeserializeObject<T>(json, deserializerSettings);
T包含property:DateTime inception_date { get; set; }property 的基本结构在哪里。解串器设置如下:
deserializerSettings = new JsonSerializerSettings()
{
    DateFormatHandling = DateFormatHandling.IsoDateFormat,
    DateParseHandling = Newtonsoft.Json.DateParseHandling.None,
    DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc
};
然而,在Newtonsoft.Json.dll的肠子中,上述时间转换为以下时间jObject。
"inception_date": "0001-01-02T00:00:00Z"
我无法进入他们的代码,但是由于损坏已经在我的代码看到另一个调用之前完成了。ReadJson在JsonConverter中调用serializer.Populate(jObject.CreateReader(), target);where target是我的类的实例T,并且jObject已经以某种不正确的日期呈现了。
谁能弄清楚为什么会发生这种情况,或者我怎么能防止这种情况发生?创建jObject的方式似乎忽略了我的序列化程序设置,该设置程序明确表示不要使用日期字符串(DateParseHandling.None)。
我已经截屏了一下,以确切说明Newtonsoft的JsonConvert方法似乎失去了至关重要的配置价值的地方。
如您所见,这就是我调用JsonConvert的代码点:

该dateParseHandling值设置为“无”,这就是它应该起作用的方式。
在下一步中,我跳了一些内部Newtonsoft调用,并进入了通用实现,该通用实现是JsonConverter我从公认的参考实现中借用的,以便能够了解发生了什么。在JsonReader突然传入已经失去了dateParseHandling价值:

由于此值已切换回DateTime-jObject的内部工作试图将其表示为内部本地化的DateTime,因为我的时区为负,所以该下溢发生了,我们已经表示了最小的DateTime值,导致转换回到UTC添加一整天。
从这个答案我有类JsonCreationConverter<T>和具体类型的一些实现.但是这个抽象类错过了WriteJson方法的实现.
通过互联网我找到了代码:
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
    //use the default serialization - it works fine
    serializer.Serialize(writer, value);
}
但是这个代码最终会出现StackOverflowException,因为它一直在调用自己(当然).其他解决方案用于具体对象实现,逐个序列化所有值.我真的想避免它,只想使用默认序列化,这对我来说没问题.只是为了避免调用我的JsonConverter进行序列化.我只需要反序列化.可能吗?怎么样?
我试图将a反序列化为Unix timestampa DateTime.在我的情况下,我需要做更多的检查才能从时间戳设置属性到DateTime.如果我使用DateTime的Newtonsoft.Json是它反序列化到UTC时间,我需要将其反序列化到一个特定的时区
问题是我无法得到正确的时间.好像我的字符串long解析失败了.如果我可以得到longunix时间戳,我可以让其余的逻辑工作
我有一个名为的班级 Alert
class Alert
{
    // Some properties
    [JsonConverter(typeof(UnixTimestampJsonConverter))]
    public DateTime Created { get; set; }
    // Some more properties
}
这个班UnixTimestampJsonConverter是
class UnixTimestampJsonConverter : JsonConverter
{
    // Other override methods
    public override object ReadJson (JsonReader reader, Type objectType, 
        object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.EndObject)
            return null;
        if (reader.TokenType == JsonToken.StartObject) {
            long instance = serializer.Deserialize<long> (reader);
            return …我正在尝试反序列化以下内容:
{"ts":"2012-04-22 04:14:50,669", "msg":"Hello"}
成
public class LogEntry
{
    public DateTime Ts { get; set; }
    public string Msg { get; set; }
}
运用
var logEntry = JsonConvert.DeserializeObject<LogEntry>(line);
但得到一个JsonSerializationException说"{"错误转换值\"2012-04-22 04:14:28,478 \"键入'System.DateTime'.第1行,第31位."}.我无法更改日志格式.
我想我可能需要使用Converter自己解析日期字符串.但是,我找不到任何相似的例子JsonConverter.具体如何读取来自该值reader的ReadJson方法.
有什么简单的例子我应该看一下吗?或者我是以错误的方式来做这件事的?