Search code examples
jsonf#datacontract

Json parsing F#


r@".NETFramework\v4.0\Profile\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 

This returns -> End element 'coordinates' from namespace '' expected. Found element 'item' from namespace ''

How can I define the DataMember coordinates so that it understands ?

Thanks a lot


Solution

  • Reference System.Runtime.Serialization and 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