问题 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 

这会返回 - > 结束元素'坐标'来自命名空间''预期。从命名空间''找到元素'item'

如何定义DataMember坐标以便它理解?

非常感谢


2443
2017-08-24 11:32


起源



答案:


参考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

8
2018-01-03 14:59



很酷,谢谢你 - jlezard


答案:


参考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

8
2018-01-03 14:59



很酷,谢谢你 - jlezard


这对我有用

#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|];}

6
2017-08-24 12:42



谢谢你的回复,但是字符串中没有\“解码,所以我需要找到一种方法让它在没有它们的情况下工作(其他的是tw.Replace(”[“,@”\“[”)。替换(“]”,@“] \”“),谢谢! - jlezard
[-7.002648,110.449961]不是字符串值而是浮点数组,如果你修复了地理定义,那么坐标字段是float [] - 它应该解决这个问题。我已经纠正了我的样本来证明这一点 - desco
谢谢,这完美! - jlezard
@Ronald Wildenberg接受了!谢谢 - jlezard
关于如何写的小方注释 tw 没有获得眼癌的定义:使用 """ 你的字符串文字周围,你可以删除所有`\`的东西,并有简单的旧JSON。 - BitTickler