相关疑难解决方法(0)

JSON.Net没有为收集项调用CanConvert?

我有一个转换器,我只想在反序列化时使用.所以我将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
        { …
Run Code Online (Sandbox Code Playgroud)

c# json.net

5
推荐指数
1
解决办法
2885
查看次数

将JSON反序列化为子类

我有3个班:

class Person {
    public bool IsFemale { get; set; }
}

class Female : Person {
    public string FemaleSpecificProperty { get; set; }
}

class Male: Person { 
    public string MaleSpecificProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

如何根据属性的值将给定的JSON字符串反序列化为特定的实例(FemaleMale)Person.IsFemale?(我不知道使用了哪种确切的类型,而且该属性是唯一的指示)

我看着雇用,CustomCreationConverter<T>但无法弄清楚如何使它在这里工作.

c# json.net

5
推荐指数
1
解决办法
3237
查看次数

使用JSON.NET与ExpandableObjectConverter的问题

我定义了以下类:

<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
Run Code Online (Sandbox Code Playgroud)

使用DataContractJsonSerializer我按预期收到以下JSON:

{
  "Vector": {
    "X": 1.23,
    "Y": 4.56,
    "Z": 7.89
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,JSON.NET产生:

{
  "Vector": "(1.23, 4.56, 7.89)"
}
Run Code Online (Sandbox Code Playgroud)

如果我ExpandableObjectConverter从类中删除该属性,JSON.NET会按预期生成结果(与DataContractJsonSerializer相同).

不幸的是,我需要ExpandableObjectConverter这样,以便该类使用属性网格.

有没有办法告诉JSON.NET忽略ExpandableObjectConverters

我更喜欢使用JSON.NET,而不是DataContractJsonSerializer因为将枚举序列化为字符串表示更容易.

c# vb.net json typeconverter json.net

5
推荐指数
1
解决办法
1835
查看次数

Json.Net无法反序列化DateTime.MinValue

我尝试过DateTime.MinValue以各种可能的方式反序列化包含的Json字符串,但是当该set方法在我的对象上被调用时。日期总是从-01-01-01-更改为-01-01-02-。

被解析的Json明确包含

"inception_date": "0001-01-01T00:00:00+00:00"
Run Code Online (Sandbox Code Playgroud)

然后JsonConvert,我呼吁:

return JsonConvert.DeserializeObject<T>(json, deserializerSettings);
Run Code Online (Sandbox Code Playgroud)

T包含property:DateTime inception_date { get; set; }property 的基本结构在哪里。解串器设置如下:

deserializerSettings = new JsonSerializerSettings()
{
    DateFormatHandling = DateFormatHandling.IsoDateFormat,
    DateParseHandling = Newtonsoft.Json.DateParseHandling.None,
    DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc
};
Run Code Online (Sandbox Code Playgroud)

然而,在Newtonsoft.Json.dll的肠子中,上述时间转换为以下时间jObject

"inception_date": "0001-01-02T00:00:00Z"
Run Code Online (Sandbox Code Playgroud)

我无法进入他们的代码,但是由于损坏已经在我的代码看到另一个调用之前完成了。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添加一整天。

c# json json.net deserialization

5
推荐指数
1
解决办法
5373
查看次数

JSON.NET:JsonCreationConverter工作WriteJson实现

从这个答案我有类JsonCreationConverter<T>和具体类型的一些实现.但是这个抽象类错过了WriteJson方法的实现.

通过互联网我找到了代码:

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
    //use the default serialization - it works fine
    serializer.Serialize(writer, value);
}
Run Code Online (Sandbox Code Playgroud)

但是这个代码最终会出现StackOverflowException,因为它一直在调用自己(当然).其他解决方案用于具体对象实现,逐个序列化所有值.我真的想避免它,只想使用默认序列化,这对我来说没问题.只是为了避免调用我的JsonConverter进行序列化.我只需要反序列化.可能吗?怎么样?

c# serialization json.net

5
推荐指数
1
解决办法
2356
查看次数

NewtonSoft.Json自定义JsonConverter反序列化为DateTime不起作用

我试图将a反序列化为Unix timestampa DateTime.在我的情况下,我需要做更多的检查才能从时间戳设置属性到DateTime.如果我使用DateTimeNewtonsoft.Json是它反序列化到UTC时间,我需要将其反序列化到一个特定的时区

问题是我无法得到正确的时间.好像我的字符串long解析失败了.如果我可以得到longunix时间戳,我可以让其余的逻辑工作

我有一个名为的班级 Alert

class Alert
{
    // Some properties

    [JsonConverter(typeof(UnixTimestampJsonConverter))]
    public DateTime Created { get; set; }

    // Some more properties
}
Run Code Online (Sandbox Code Playgroud)

这个班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 …
Run Code Online (Sandbox Code Playgroud)

c# timezone datetime json json.net

4
推荐指数
1
解决办法
4746
查看次数

在json.net中转换为DateTime

我正在尝试反序列化以下内容:

{"ts":"2012-04-22 04:14:50,669", "msg":"Hello"}
Run Code Online (Sandbox Code Playgroud)

public class LogEntry
{
    public DateTime Ts { get; set; }
    public string Msg { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

运用

var logEntry = JsonConvert.DeserializeObject<LogEntry>(line);
Run Code Online (Sandbox Code Playgroud)

但得到一个JsonSerializationException说"{"错误转换值\"2012-04-22 04:14:28,478 \"键入'System.DateTime'.第1行,第31位."}.我无法更改日志格式.

我想我可能需要使用Converter自己解析日期字符串.但是,我找不到任何相似的例子JsonConverter.具体如何读取来自该值readerReadJson方法.

有什么简单的例子我应该看一下吗?或者我是以错误的方式来做这件事的?

.net c# datetime json json.net

3
推荐指数
1
解决办法
5369
查看次数