16

DataContractJsonSerializer は、各プロパティ名の後に「@」文字を含む F# レコード タイプの JSON を作成します。この末尾に記号がない JSON を取得できるかどうかは誰にもわかりませんか?

{"heart_rate@":20,"latitude@":45.0,"longitude@":108.0,"name@":"Rambo"}

このサンプルを出力するために使用するスクリプトは次のとおりです

#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
4

2 に答える 2

13

コンパイラが生成したバッキング フィールドの名前を使用しています。を使用DataMemberAttributeして、独自の名前を指定できます。

[<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}
于 2012-10-23T19:36:47.067 に答える
8

Danielのソリューションは正しく機能しますが、レコード内のすべてのプロパティに属性を追加する必要があるのはかなり面倒です。Json.NETは、箱から出してより読みやすいJSONを生成することがわかりました。私のアプリケーションでは、DataContractSerializerを特に使用する必要はないので、JSON.netを使用します。

于 2012-10-24T04:39:35.547 に答える