JSON 正在解析记录集合

JSON parsing collection of records

我为此苦恼了很久,我相信我的唱片设计有问题。

我的 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))

我怀疑您读取数据的方式一定有问题。我试图重现这一点,并将从流中读取的内容替换为从字符串中读取 - 这样我就可以对此进行测试 - 并且以下工作正常(在 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() returns - 我怀疑那里一定有问题,因为其余代码对我来说工作正常。