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 - 我怀疑那里一定有问题,因为其余代码对我来说工作正常。
我为此苦恼了很久,我相信我的唱片设计有问题。
我的 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 - 我怀疑那里一定有问题,因为其余代码对我来说工作正常。