2012-10-23 14 views
13

DataContractJsonSerializer crea JSON per i tipi di record F # che include il carattere '@' dopo ogni nome di proprietà. Qualcuno sa se è possibile ottenere JSON che non ha questo trailing al simbolo?Serializzare F # Il tipo di record su JSON include il carattere '@' dopo ogni proprietà

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

Ecco lo script che uso per produrre questo campione

#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, ecco come lo faccio funzionare in API Web ASP.NET: http://blog.ploeh.dk/2013/10/15/easy-aspnet-web-api-dtos-with-f-climutable- record –

risposta

5

Sebbene la soluzione di Daniel funzioni correttamente, è piuttosto noioso dover aggiungere attributi a ogni proprietà nel record. Si scopre che JSON.NET produce JSON più leggibile senza problemi. Per la mia applicazione non è necessario utilizzare DataContractSerializer in modo specifico, quindi JSON.net lo è!

+1

Json.Net aggiunge '@' anche a me. Quindi, solo la soluzione di Daniel ha risolto il problema. – abatishchev

+0

@abatishchev Quale versione di Json.NET hai provato? È stato aggiunto il supporto per F # in 6. Immagino che se si stesse utilizzando una versione precedente non funzionerebbe correttamente. –

+0

@Kazark: se ricordo male, era 6.0.x, quindi anche con "supporto F #" non ha funzionato bene per me. – abatishchev

11

E 'utilizzando il nome dei campi backing compilatore generato. È possibile utilizzare DataMemberAttribute per fornire i propri nomi.

Problemi correlati