JSON解析F#

JSON解析F#

问题描述:

R 7 “NETFramework \ V4.0 \资料\客户\ 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 

这将返回 - > 结束元素从命名空间 '坐标' '' 预期。从命名空间'JSON解析F#

中找到元素'item'如何定义DataMember坐标以便它理解?

非常感谢

参考System.Runtime.Serialization和System.Xml

(互动: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

是的,感谢这一点 – jlezard 2011-01-04 22:46:20

这对我的作品

#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

感谢您的回复,但是在字符串中没有“解码”,所以我需要找到一种方法使其工作w ithout他们(其他那tw.Replace(“[”,@“\”[“)。替换(”]“,@”] \“”),谢谢! – jlezard 2010-08-24 12:58:45

+0

[-7.002648,110.449961]不是字符串值,而是浮点数组,如果您修复了地理定义,所以坐标字段为float [] - 它应该解决此问题。我已更正我的示例以演示此 – desco 2010-08-24 13:36:21

+0

谢谢你的作品perfecto! – jlezard 2010-08-24 13:43:49