2016-02-03 75 views
5

我有一個F#類型,我從HTTP Web請求的內容反序列化爲對象。我所調用的API使用odata協議,該請求的內容具有以下格式,包含密鑰@odata.context使用json.net和包含@符號的json屬性反序列化爲F#類型

{ 
    "@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 –

+0

我正在使用F#3.0和json.net 6.0.4 –

+1

你看過C#的答案在SO這裏,因爲json.net是一個.net版本,並將使用C#? –

回答

2

如果您沒有機會將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";} 

鏈接:

https://dotnetfiddle.net/SR16Ci

相關問題