2016-02-03 19 views
5

Ho un tipo F # che deserializzo su un oggetto dal contenuto di una richiesta Web HTTP. L'API che sto chiamando utilizza un protocollo odata e il contenuto di tale richiesta ha il seguente formato con la chiave @odata.context.Deserializzazione su un tipo F # utilizzando json.net e una proprietà json contenente un simbolo @

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

Sto usando Json.net per deserializzare il contenuto di nuovo al mio tipo di F #, il tipo di F # è la seguente

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

odata.context è sempre null in questa situazione.

Ho provato sia la seguente (con il simbolo @ in # tipo di nome della proprietà F) e il risultato è NULL

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

(senza il simbolo @ nel # tipo di nome della proprietà F) questo viene deserializzato correttamente .

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

Credo che questo potrebbe essere a che fare con il simbolo @ nel nome della proprietà.

Qualsiasi idea su una soluzione sarebbe ottima.

+1

Quale versione stai usando? https://dotnetfiddle.net/s6W7yJ –

+0

Sto usando F # 3.0 e json.net 6.0.4 –

+1

Hai guardato le risposte C# qui in SO dal momento che json.net è una versione .net e funzionerà con C#? –

risposta

2

Se non si ha l'opportunità di aggiornare Json.Net a un nuovo (ad esempio 8.0.2), è possibile utilizzare uno Newtonsoft.Json.Linq.

Esempio:

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" 

Stampa:

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

Link:

https://dotnetfiddle.net/SR16Ci

Problemi correlati