2012-10-23 4 views
13

Der DataContractJsonSerializer erstellt JSON für F # Datensatztypen, die das '@' Zeichen nach jedem Eigenschaftsname enthält. Weiß jemand, ob es möglich ist, JSON zu erhalten, das dieses nachgestellte Symbol nicht hat?Serialisierung F # Datensatztyp zu JSON enthält '@' Zeichen nach jeder Eigenschaft

{"[email protected]":20,"[email protected]":45.0,"[email protected]":108.0,"[email protected]":"Rambo"} 

Hier ist das Skript, das ich diese Probe zur Ausgabe verwenden

#r "System.Xml" 
#r "System.Runtime.Serialization" 

open System.Text 
open System.Runtime.Serialization.Json 
open System.IO 

type Update = { 
    name: string; 
    latitude: decimal; 
    longitude: decimal; 
    heart_rate: int} 

let update = {name = "Rambo"; latitude = 45.0m; longitude = 108.0m; heart_rate = 20} 

let serializer = new DataContractJsonSerializer(typeof<Update>) 

let stream = new MemoryStream() 
let data = serializer.WriteObject(stream, update) 
let updateData = stream.ToArray() 

let json = (Encoding.UTF8.GetString(updateData)) 

printfn "%s" json 
+0

FWIW, hier ist, wie ich es in ASP.NET Web API arbeiten lassen: http://blog.ploeh.dk/2013/10/15/easy-aspnet-web-api-dtos-with-f-climutable- Aufzeichnungen –

Antwort

5

Obwohl Daniels Lösung korrekt funktioniert, ist es ziemlich mühsam, jeder Eigenschaft im Datensatz Attribute hinzuzufügen. Es stellt sich heraus, dass Json.NET mehr lesbare JSON out-of-the-box produziert. Für meine Anwendung muss ich den DataContractSerializer nicht speziell verwenden, also JSON.net ist es!

+1

Json.Net hängt '@' auch für mich an. Also löste nur Daniels Lösung das Problem. – abatishchev

+0

@abatishchev Welche Version von Json.NET hast du versucht? Unterstützung wurde für F # in 6 hinzugefügt. Ich stelle mir vor, wenn Sie eine vorherige Version verwenden würden, würde es nicht gut funktionieren. –

+0

@Kazark: wenn ich mich richtig erinnere, war es 6.0.x, also sogar mit "F # support" hat es nicht gut für mich funktioniert. – abatishchev

11

Es ist der Name der Compiler erzeugten Träger Felder verwenden. Sie können DataMemberAttribute verwenden, um Ihre eigenen Namen anzugeben.

[<DataContract>] 
type Update = { 
    [<field: DataMember(Name="name")>] 
    name: string; 
    [<field: DataMember(Name="latitude")>] 
    latitude: decimal; 
    [<field: DataMember(Name="longitude")>] 
    longitude: decimal; 
    [<field: DataMember(Name="heart_rate")>] 
    heart_rate: int} 
Verwandte Themen