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

6

我有一个 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# 类型属性名称中使用 @ 符号),结果为 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
你使用的是哪个版本?https://dotnetfiddle.net/s6W7yJ - FoggyFinder
我正在使用 F#3.0 和 json.net 6.0.4。 - Alan Mulligan
1
你是否在SO上查看过C#的答案,因为json.net是一个.NET版本,可以与C#一起使用? - Guy Coder
你无法更新json.net的版本吗? - FoggyFinder
2
请确保使用 Newtonsoft.Json.8.0.2 - 这个版本的 json.net 可以让你正确地反序列化对象。 我最初尝试了版本 6.0.4,遇到了和你一样的问题。 - Marta
1个回答

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

示例:

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"

打印:

{odata.context = "OData";
 Value = "token";}

Link:

https://dotnetfiddle.net/SR16Ci


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接