2010-08-24 14 views
11

R @ "NETFramework \ v4.0 \ Profilo \ Client \ System.Runtime.Serialization.dll"

open System.Runtime.Serialization 
open System.Runtime.Serialization.Json 

[<DataContract>] 
    type geo = { 
     [<field: DataMember(Name = "type")>] 
     t:string 
     [<field: DataMember(Name = "coordinates")>] 
     coordinates:string 
     } 


let decode (s:string) = 
    let json = new DataContractJsonSerializer(typeof<geo>) 
    let byteArray = Encoding.UTF8.GetBytes(s) 
    let stream = new MemoryStream(byteArray) 
    json.ReadObject(stream) :?> geo 

let tw = {"type":"Point","coordinates":[-7.002648,110.449961]} 

decode tw 

Ciò restituisce -> Fine elemento 'coordinate' dal namespace '' previsto . Elemento trovato 'elemento' dal namespace ''JSON parsing F #

Come definire le coordinate DataMember in modo che comprenda?

Grazie mille

risposta

8

Riferimento System.Runtime.Serialization e System.Xml

(Interactive: #r "System.Runtime.Serialization")

open System.IO 
open System.Runtime.Serialization.Json 
open System.Xml 
open System.Text 

/// Object to Json 
let internal json<'t> (myObj:'t) = 
     use ms = new MemoryStream() 
     (new DataContractJsonSerializer(typeof<'t>)).WriteObject(ms, myObj) 
     Encoding.Default.GetString(ms.ToArray()) 


/// Object from Json 
let internal unjson<'t> (jsonString:string) : 't = 
     use ms = new MemoryStream(ASCIIEncoding.Default.GetBytes(jsonString)) 
     let obj = (new DataContractJsonSerializer(typeof<'t>)).ReadObject(ms) 
     obj :?> 't 
+0

sì freddo, grazie per questo – jlezard

6

questo funziona per me

#r "System.Runtime.Serialization" 

open System.IO 
open System.Text 
open System.Runtime.Serialization 
open System.Runtime.Serialization.Json 

[<DataContract>] 
    type geo = { 
     [<field: DataMember(Name = "type")>] 
     t:string 
     [<field: DataMember(Name = "coordinates")>] 
     coordinates:float[] 
     } 


let decode (s:string) = 
    let json = new DataContractJsonSerializer(typeof<geo>) 
    let byteArray = Encoding.UTF8.GetBytes(s) 
    let stream = new MemoryStream(byteArray) 
    json.ReadObject(stream) :?> geo 

let tw = "{ 
    \"type\":\"Point\", 
    \"coordinates\":[-7.002648,110.449961] 
    }" 

let v = decode tw // val v : geo = {t = "Point"; coordinates = [|-7.002648; 110.449961|];} 
+0

grazie per la risposta, ma non ci sono \ "nella stringa da decodificare, quindi ho bisogno di trovare un modo per farlo funzionare w Senza di loro (altro che tw.Replace ("[", @ "\" ["). Sostituisci ("] ", @"] \ ""), grazie! – jlezard

+0

[-7.002648,110.449961] non è un valore stringa ma una matrice di float, se si risolve la definizione di geo in modo che il campo delle coordinate sia float [] - dovrebbe risolvere questo problema. Ho corretto il mio campione per dimostrare questo – desco

+0

Grazie che funziona perfecto! – jlezard