【问题标题】:Serializing F# Record type to JSON includes '@' character after each property将 F# 记录类型序列化为 JSON 在每个属性后包含“@”字符
【发布时间】:2012-10-23 19:09:32
【问题描述】:

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

【问题讨论】:

标签: json f#


【解决方案1】:

它使用编译器生成的支持字段的名称。您可以使用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}

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • Json.Net 也为我附加了@。所以只有丹尼尔的解决方案解决了这个问题。
    • @abatishchev 您尝试了哪个版本的 Json.NET?在 6 中添加了对 F# 的支持。我想如果您使用的是之前的版本,它将无法正常工作。
    • @Kazark:如果我没记错的话,它是 6.0.x,所以即使有“F# 支持”,它对我来说也不是很好。
    • Json.Net '正常工作',但是在 Web API 中,它的绑定被 System.Net.Http 类覆盖,但它没有。但是,您可以将它们设置回 Newtonsoft 默认值:stackoverflow.com/a/26036775/26167
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 2015-09-20
    • 2015-07-29
    相关资源
    最近更新 更多