2014-01-07 3 views
5

Hier ist mein Code:Serialisierung von F # änderbare Variable JSON Json.NET Verwendung erzeugt duplizierten Artikel

open Newtonsoft.Json 
open Newtonsoft.Json.Converters 

type T = { 
    mutable name : string; 
    mutable height : int; 
    } 

let a = { name = "abc"; height = 180;} 
a.height <- 200 
let b = JsonConvert.SerializeObject(a, Formatting.Indented) 
printfn "%s" b 

Der Ausgang des Codes ist:

{ 
    "[email protected]": "abc", 
    "[email protected]": 200, 
    "name": "abc", 
    "height": 200 
} 

Wie kann ich die Ausgänge vermeiden, "@" in der Eigenheit?

Antwort

1

Haben Sie versucht, Attribute [< ...>] vor der Eigenschaft hinzuzufügen? Weil dieses Attribut nur für die Eigenschaft und nicht für das generierte Backend gilt. Nicht sicher, auf welches Attribut JSON.NET jedoch reagiert.

+1

JSON.Net arbeitet mit den Attributen DataContract/DataMember und JsonObject/JsonProperty. – user2864740

1

Mit Hilfe von DataMemberAttribute Sie Namen der serialisierten Elemente angeben:

type T = { 
    [<field: DataMember(Name="name")>] 
    mutable name : string; 
    [<field: DataMember(Name="height")>] 
    mutable height : int; 
} 
+0

Fügen Sie einen [] über Ihrem 'Typ T =' hinzu und es wird funktionieren. – AlfredBr

+0

Dies funktioniert, ist aber ein wenig mühsam, vor allem für Datensätze mit vielen Feldern. – Daniel

3

testen:

[<CLIMutable>] 
[<JsonObject(MemberSerialization=MemberSerialization.OptOut)>] 
type T = { 
    name : string; 
    height : int; 
    } 

MemberSerialization.OptOut Ursachen nur öffentliche Mitglieder serialisiert (Überspringen private Felder werden, die eine sind Implementierungsdetails von Datensätzen). Das Attribut CLIMutable ist intended specifically for serialization und erspart das Voranstellen jedes Mitglieds mit mutable.

+0

Die von [] hinzugefügten Funktionen werden anscheinend nicht F # ausgesetzt. [] ist das Standardverhalten (also kein Unterschied in den Ausgaben). Ich habe versucht mit MemberSerialization.fields Option, die die Ausgaben auf { "name @": "abc", "Höhe @": 200 } reduzieren. Immer noch nicht ideal. – WhiteBoard

+0

Der obige Code hat nicht die Felder mit dem Zusatz '@' ausgegeben. – Daniel

+0

Ich muss immer noch das Schlüsselwort "mutable" hinzufügen, da [] die Variable im F # -Code nicht änderbar macht. Bei "veränderbar" enthält die Ausgabe "@". – WhiteBoard

Verwandte Themen