将F#记录类型序列化为JSON在每个属性后包含"@"字符

Joh*_*ood 14 f# json

DataContractJsonSerializer为F#记录类型创建JSON,其中包含每个属性名称后面的"@"字符.有没有人知道是否有可能获得没有这个尾随符号的JSON?

{"heart_rate@":20,"latitude@":45.0,"longitude@":108.0,"name@":"Rambo"}
Run Code Online (Sandbox Code Playgroud)

这是我用来输出此示例的脚本

#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
Run Code Online (Sandbox Code Playgroud)

Dan*_*iel 11

它使用编译器生成的支持字段的名称.您可以使用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}
Run Code Online (Sandbox Code Playgroud)


Joh*_*ood 6

虽然Daniel的解决方案可以正常工作,但是必须为记录中的每个属性添加属性是相当繁琐的.事实证明,Json.NET开箱即用产生更具可读性的JSON.对于我的应用程序,我不需要专门使用DataContractSerializer,所以它是JSON.net!

  • Json.Net“正常工作”,但是在 Web API 中,它的绑定被 System.Net.Http 类覆盖,而后者没有。您*可以*将它们设置回 Newtonsoft 默认值:http://stackoverflow.com/a/26036775/26167 (2认同)