2016-03-30 7 views
5

今日Newtonsoft.Jsonからの奇妙な出力に気づきましたが、F#の種類やC#で発生する可能性のあるものとのインタラクションかどうかはわかりません。 。私は、次のレコードのリストが連載されています:Newtonsoft.Jsonいくつかの項目を2回シリアル化する

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

私はJsonConvert.SerializeObjectでそれをシリアル化し、私は次の奇妙な出力を得る:それは起きている可能性がある理由

"splits": [ 
    { 
    "[email protected]": "0.00", 
    "[email protected]": "0.00", 
    "[email protected]": 0, 
    "[email protected]": null, 
    "start": "0.00", 
    "end": "0.00", 
    "lapCount": 0, 
    "duration": null 
    }, 
    { 
    "[email protected]": "0.00", 
    "[email protected]": "0.00", 
    "[email protected]": 0, 
    "[email protected]": null, 
    "start": "0.00", 
    "end": "0.00", 
    "lapCount": 0, 
    "duration": null 
    } 

誰もが知っているの?データは正しいですが、 "@"記号でフィールドを複製することが重要です。

答えて

6

あなたのレコードを定義した方法は、ここでの犯人です。レコードフィールドはプロパティとして公開されますが、変更可能なプロパティを使用しています。 F#はそれぞれの変数のフィールドを持つクラスに変換します(名前はプロパティ名で、@が前に付いています)。

Jsonはすべてのフィールドをシリアル化しようとしますすべてのプロパティ - したがって、重複を取得します。

インタラクティブF#でそれを試してみてください:

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' 

これは正しくシリアル化する必要がある:平野レコードを使用しているとき何を得るとその

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' 

コントラストを。それとは別に、あなたのコードはより慣用的になります。

+0

ありがとう、私はカスタムコンバータで修正できるかのように見えるか、多分可変変数なしでこのアルゴリズムを見つけ出すことができますか? – jackmott

+3

あなたの可変フィールドに '[]'無視されます。 – Tarmil

+0

@ジャックモット:あなたのアルゴリズムを突然変異に頼らないように再考する方法があると思います。疑わしい場合は、ここに投稿してください。 –

関連する問題