2016-02-03 8 views
5

私は、HTTP Webリクエストの内容からオブジェクトに逆シリアル化するF#タイプを持っています。私が呼び出しているAPIはodataプロトコルを使用しており、その要求の内容は以下の形式を持ち、キーは@odata.contextです。json.netを使用してF#タイプに逆シリアル化し、@記号を含むjsonプロパティ

type Success = { 
    [<JsonProperty(PropertyName = "@odata.context")>] 
    ``odata.context``: string; 
    Value: string; } 

odata.contextは、常にこのような状況でnullで次のように私は戻って私のF#型にコンテンツをデシリアライズするJson.netを使用しています

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

は、F#の型があります。

私は(F#の型プロパティ名に@記号で)以下の結果がこれを正しくデシリアライズされます(F#の型プロパティ名に@記号なし)

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

NULLで両方試してみました

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

json.netは.netバージョンであり、C#で動作するので、ここで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

関連する問題