【问题标题】:JSON parsing collection of recordsJSON解析记录集合
【发布时间】:2018-03-17 19:26:10
【问题描述】:

我一直在为此苦苦挣扎,我认为我的唱片设计有问题。

我的 json 如下所示。我早些时候将此作为另一个问题的一部分发布,但没有得到完整的答案,特别是对于这一部分。数组中的每条记录都是一个对象,其字段名称为字符串类型的数据。

JSON

[
    {
        "data": "/publication/a40a5e5c-98b3-45ae-d6a3-924b31d8712a/article/test;version=1521246543034"
    }, 
    {
        "data": "/publication/a40a5e5c-98b3-45ae-d6a3-924b31d8712a/book/test2;version=1520623346891"
    }, 
    {
        "data": "/publication/a40a5e5c-98b3-45ae-d6a3-924b31d8712a/catalog/test3;version=1520623346833"
    }
]

List.fs

open System.Runtime.Serialization

[<DataContract>]
type List= {
    [<field: DataMemberAttribute(Name="data") >]
    Data: string
}

解析 JSON

let response = request.GetResponse() :?> HttpWebResponse
use reader = new StreamReader(response.GetResponseStream())
use memoryStream = new MemoryStream(ASCIIEncoding.Default.GetBytes(reader.ReadToEnd())) 
let jsonSerializer = DataContractJsonSerializer(typeof<List[]>)
let result = jsonSerializer.ReadObject(memoryStream) :?> List[]
Debug.WriteLine(sprintf "%A" result)

实际输出 - 有空值

[|
    {Data = null;}; 
    {Data = null;}; 
    {Data = null;}
|]

预期输出

[|
    {Data = "/publication/a40a5e5c-98b3-45ae-d6a3-924b31d8712a/article/test;version=1521246543034";}; 
    {Data = "/publication/a40a5e5c-98b3-45ae-d6a3-924b31d8712a/book/test2;version=1520623346891";}
    {Data = "/publication/a40a5e5c-98b3-45ae-d6a3-924b31d8712a/catalog/test3;version=1520623346833";}
|]

迭代

result 
 > Array.iter (fun x -> Console.WriteLine(x.Href))

【问题讨论】:

    标签: json collections f# datacontractjsonserializer


    【解决方案1】:

    我怀疑您读取数据的方式一定有问题。我试图重现这一点,并将从流中读取的内容替换为从字符串中读取 - 这样我就可以对此进行测试 - 以下工作正常(在 F# 交互式版本 14.0.23413.0 中):

    #r "System.Runtime.Serialization"
    open System.IO
    open System.Text
    open System.Runtime.Serialization
    open System.Runtime.Serialization.Json
    
    [<DataContract>]
    type List= {
        [<field: DataMemberAttribute(Name="data") >]
        Data: string
    }
    
    let reader = new StringReader("""[
        { "data": "/publication/a40a5e5c/article/test;version=1521246543034" }, 
        { "data": "/publication/a40a5e5c/book/test2;version=1520623346891" }, 
        { "data": "/publication/a40a5e5c/catalog/test3;version=1520623346833" } ]""")
    
    let memoryStream = new MemoryStream(ASCIIEncoding.Default.GetBytes(reader.ReadToEnd())) 
    let jsonSerializer = DataContractJsonSerializer(typeof<List[]>)
    let result = jsonSerializer.ReadObject(memoryStream) :?> List[]
    result
    

    您能否检查您的输入 JSON 是否真的是您在此处共享的那个?为此,请在调用 GetBytes 之前查看 reader.ReadToEnd() 返回的内容 - 我怀疑那里一定有问题,因为其余代码对我来说可以正常工作。

    【讨论】:

    • 看你如何使用StringReader很有趣
    • @App2015 老实说,这只是因为我从一开始就浏览了你的代码并修改了我能做的第一件事:) StringReader 完全没有必要。
    猜你喜欢
    • 2023-03-06
    • 2022-08-10
    • 1970-01-01
    • 1970-01-01
    • 2018-01-24
    • 2017-11-17
    • 2018-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多