使用json.net和包含@符号的json属性反序列化为F#类型

时间:2016-02-03 08:40:08

标签: f# json.net

我有一个F#类型,我从HTTP Web请求的内容反序列化到一个对象。我正在调用的API使用odata协议,该请求的内容具有以下格式,其中包含密钥@odata.context

{
    "@odata.context":"OData",
    "Value":"token"
}

我使用Json.net将内容反序列化为我的F#类型,F#类型如下

type Success = {
    [<JsonProperty(PropertyName = "@odata.context")>]
    ``odata.context``: string;
    Value: string; }
在这种情况下,

odata.context始终为null

我已尝试过以下两种方法(使用F#type属性名中的@符号),结果为NULL

let test1 = JsonConvert.DeserializeObject<Success>("{\"@odata.context\": \"odata.context\", \"Value\": \"token\"}"))

(没有F#类型属性名中的@符号)这会正确反序列化。

let test2 = JsonConvert.DeserializeObject<Success>("{\"odata.context\": \"odata.context\", \"Value\": \"token\"}"))

我相信这可能与属性名称中的@符号有关。

关于解决方案的任何想法都会很棒。

1 个答案:

答案 0 :(得分:2)

如果您没有机会将Json.Net更新为更新版本(例如8.0.2),则可以使用Newtonsoft.Json.Linq

示例:

datasetpairs$mean <- mean( dataset[[datasetpairs$numerator]] / 
dataset[[datasetpairs$demonimator]]

打印:

open System
open Newtonsoft.Json.Linq

type Success = {
    ``odata.context``: string;
    Value: string; }

let json =  "{\"@odata.context\":\"OData\",\"Value\":\"token\"}"

let p = JObject.Parse(json)

{``odata.context`` = p.["@odata.context"] |> string ;Value = p.["Value"] |> string}
|> printfn "%A"

链接:

https://dotnetfiddle.net/SR16Ci