【问题标题】:Newtonsoft.Json serializing some items twiceNewtonsoft.Json 将某些项目序列化两次
【发布时间】:2016-03-31 00:03:23
【问题描述】:

我今天注意到 Newtonsoft.Json 的一些奇怪输出,我不确定这是与 F# 类型的交互还是 C# 中也可能发生的事情,所以我已经标记了两者。我有以下正在序列化的记录的列表:

 type SplitTracker = 
  {  
     [<JsonIgnore>]   
     split            : SplitDefinition
     mutable start    : duration
     mutable ``end``  : duration
     mutable lapCount : int
     mutable duration : duration Option
  }   

我用JsonConvert.SerializeObject 对其进行序列化,得到以下奇怪的输出:

 "splits": [
  {
    "start@": "0.00",
    "end@": "0.00",
    "lapCount@": 0,
    "duration@": null,
    "start": "0.00",
    "end": "0.00",
    "lapCount": 0,
    "duration": null
  },
  {
    "start@": "0.00",
    "end@": "0.00",
    "lapCount@": 0,
    "duration@": null,
    "start": "0.00",
    "end": "0.00",
    "lapCount": 0,
    "duration": null
  }

有人知道为什么会这样吗?数据是正确的,带有“@”符号的字段重复是问题。

【问题讨论】:

    标签: f# json.net


    【解决方案1】:

    您定义记录的方式是这里的罪魁祸首。记录字段作为属性公开 - 但您使用的是可变属性。 F# 将把它变成一个类,其中包含每个可变变量的字段(名称是属性名称,以 @ 为前缀),以及读取这些字段的属性。

    Json 现在将尝试序列化所有字段所有属性 - 因此你得到了重复。

    在 F# 交互中试用:

    type SplitTracker = 
        {  
            mutable start    : float
        }   
    let t = typeof<SplitTracker>
    let fields1 = t.GetFields() // This will give you a field '@start'
    let props1 = t.GetProperties() // This will give you a property 'start'
    

    将其与使用普通记录时得到的结果进行对比:

    type SplitTracker2 = 
        {  
            start    : float
        }   
    let t2 = typeof<SplitTracker2>
    let fields2 = t2.GetFields() // You will not see any fields
    let props2 = t2.GetProperties() // There is a single property 'start'
    

    这应该正确序列化。除此之外,它还使您的代码更加地道。

    【讨论】:

    • 谢谢,看来我可以用自定义转换器解决这个问题,或者如果我可以在没有可变变量的情况下找出这个算法
    • 您可以在可变字段上使用[&lt;field: JsonIgnore&gt;],以便忽略该字段。
    • @jackmott:我敢打赌,有一种方法可以重新考虑您的算法,使其不依赖于突变。如有疑问,请在此处发布。
    • 我确定有,我打算试一试。这是一个很好的借口。
    • @AntonSchwaighofer - 明白了,所有可变值都消失了,所有循环都消失了,json 现在看起来不错。想想我刚刚在函数式编程方面达到了水平。
    猜你喜欢
    • 1970-01-01
    • 2012-06-07
    • 2018-05-02
    • 2023-02-05
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    相关资源
    最近更新 更多