2016-02-03 11 views
5

Mam typ F #, który deserializuję do obiektu z treści żądania HTTP HTTP. Interfejs API, do którego dzwonię, używa protokołu ODATA, a treść tego żądania ma następujący format zawierający klucz @odata.context.Deserializowanie do typu F # za pomocą json.net i właściwości json zawierającej symbol @

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

Używam Json.NET deserializacji zawartość z powrotem do mojego F # typu F # typu jest następująca

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

odata.context jest zawsze null w tej sytuacji.

Próbowałem oba następujące (z symbolem @ w F # typu nazwy właściwości), a wynik jest NULL

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

(bez symbolu @ w F # typu nazwy właściwości) Ten dostaje rozszeregować poprawnie .

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

Wierzę, że może to mieć związek z symbolem @ w nazwie nieruchomości.

Wszelkie pomysły na rozwiązanie byłoby świetne.

+1

Co wersji używasz? https://dotnetfiddle.net/s6W7yJ –

+0

Używam F # 3.0 i json.net 6.0.4 –

+1

Czy spojrzałeś na odpowiedzi C# tutaj w SO, ponieważ json.net jest wersją .net i będzie działać z C#? –

Odpowiedz

2

Jeśli nie masz możliwości zaktualizowania Json.Net do nowszej wersji (na przykład 8.0.2), możesz użyć Newtonsoft.Json.Linq.

Przykład:

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" 

druku:

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

Link:

https://dotnetfiddle.net/SR16Ci