gpt4 book ai didi

c# - DataContractJsonSerializer 的反序列化问题

转载 作者:IT王子 更新时间:2023-10-29 04:30:49 25 4
gpt4 key购买 nike

我有以下 JSON 片段:

[{
"name": "numToRetrieve",
"value": "3",
"label": "Number of items to retrieve:",
"items": {
"1": "1",
"3": "3",
"5": "5"
},
"rules": {
"range": "1-2"
}
},
{
"name": "showFoo",
"value": "on",
"label": "Show foo?"
},
{
"name": "title",
"value": "Foo",
"label": "Foo:"
}]

全部在一行版本中(适用于字符串文字):

[{\"name\":\"numToRetrieve\",\"value\":\"3\",\"label\":\"Number of items to retrieve:\",\"items\":{\"1\":\"1\",\"3\":\"3\",\"5\":\"5\"},\"rules\":{\"range\":\"1-2\"}},{\"name\":\"showFoo\",\"value\":\"on\",\"label\":\"Show foo?\"},{\"name\":\"title\",\"value\":\"Foo\",\"label\":\"Foo:\"}]

在上面的例子中,name , value , 和 label是必需的,但 itemsrules是可选的。

这是我要反序列化的类:

using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization;

namespace foofoo
{
[DataContract]
public sealed class FooDef
{
[DataMember(Name = "name", IsRequired = true)]
public string Name { get; set; }

[DataMember(Name = "value", IsRequired = true)]
public string Value { get; set; }

[DataMember(Name = "label", IsRequired = true)]
public string Label { get; set; }

[DataMember(Name = "items", IsRequired = false)]
public Dictionary<string, string> Items { get; set; }

[DataMember(Name = "rules", IsRequired = false)]
public Dictionary<string, string> Rules { get; set; }
}
}

这是我用来反序列化的代码:

var json = new DataContractJsonSerializer(typeof(List<FooDef>));
var bar = "[{\"name\":\"numToRetrieve\",\"value\":\"3\",\"label\":\"Number of items to retrieve:\",\"items\":{\"1\":\"1\",\"3\":\"3\",\"5\":\"5\"},\"rules\":{\"range\":\"1-2\"}},{\"name\":\"showFoo\",\"value\":\"on\",\"label\":\"Show foo?\"},{\"name\":\"title\",\"value\":\"Foo\",\"label\":\"Foo:\"}]";
var stream = new MemoryStream(Encoding.UTF8.GetBytes(bar));
var foo = json.ReadObject(stream);
stream.Close();

除了 items 之外,一切都相当顺利和 rules第一个是空的 FooDef经过。我已经尝试了所有方法来尝试填充它们:自定义类,NameValueCollection , KeyValuePair<string, string> , List后者,以及似乎适用的所有其他集合。 [编辑:我忘了尝试 Hashtable ,这似乎是一个明显的候选人。没用。]

在我看来,问题在于 items 下的关键部分和 rules是开放式的。也就是说,它并不总是被称为 range3 .有什么建议或想法吗?

最佳答案

恕我直言,无法使用 DataContractJsonSerializer 将您提供的 JSON 字符串反序列化到 .NET 类中。

问题出在路上DataContractJsonSerializer序列化字典。您可以使用替代序列化程序,例如 Json.NET (我强烈推荐)或 JavaScriptSerializer (我认为它已被弃用,有利于 DataContractJsonSerializer 但它适用于您的场景)。

您还可以阅读 these rants .

文档: Serializing Collections - Json.NET

关于c# - DataContractJsonSerializer 的反序列化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/596271/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com