我有一个F#类型,我从HTTP Web请求的内容反序列化到一个对象.我正在调用的API使用odata协议,该请求的内容具有以下格式并包含密钥@odata.context.
{
"@odata.context":"OData",
"Value":"token"
}
Run Code Online (Sandbox Code Playgroud)
我使用Json.net将内容反序列化为我的F#类型,F#类型如下
type Success = {
[<JsonProperty(PropertyName = "@odata.context")>]
``odata.context``: string;
Value: string; }
Run Code Online (Sandbox Code Playgroud)
odata.context总是null在这种情况下.
我已经尝试了以下两种方法(在F#类型属性名称中使用@符号),结果为NULL
let test1 = JsonConvert.DeserializeObject<Success>("{\"@odata.context\": \"odata.context\", \"Value\": \"token\"}"))
Run Code Online (Sandbox Code Playgroud)
(在F#类型属性名称中没有@符号)这会正确反序列化.
let test2 = JsonConvert.DeserializeObject<Success>("{\"odata.context\": \"odata.context\", \"Value\": \"token\"}"))
Run Code Online (Sandbox Code Playgroud)
我相信这可能与属性名称中的@符号有关.
对解决方案的任何想法都会很棒.
如果您没有机会将 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"
Run Code Online (Sandbox Code Playgroud)
打印:
{odata.context = "OData";
Value = "token";}
Run Code Online (Sandbox Code Playgroud)
关联:
https://dotnetfiddle.net/SR16Ci