JSON.net问题:JsonConvert.DeserializeObject的问题

4
我可以帮忙翻译。以下是代码和json:

我有以下的代码和json:

public class Labels
{
    public Labels()
    {}

    public Label[] Label {get;set;}
}

public class Label
{
    public Label()
    { }
    public string Name { get; set; }
    public int TorrentsInLabel { get; set; }
}

//...
Labels o = JsonConvert.DeserializeObject<Labels>(json);
//...


{"label": 
[
  ["seq1",1]
  ,["seq2",2]
]}

我希望将这个数组 ["seq1","1"] 反序列化成 Label 对象。我缺少什么?需要一些属性吗?
当我运行时,会出现异常:期望类型为 'test_JSONNET.Label' 的 JsonArrayContract,但实际得到的是 'Newtonsoft.Json.Serialization.JsonObjectContract'。
谢谢。
gg

你尝试过“反射”它吗? - Eran Betzalel
JSON.net 是开源的,我现在正在查看代码,但到目前为止还没有发现什么问题。 - grega g
建议:在查看源代码之前,先阅读一些文档资料如何?(http://james.newtonking.com/projects/json/help/) - Svish
2
那里的大部分文档都是由源代码自动生成的。 - grega g
我完全同意!这只是参考。我一直在处理完全相同的情况...默认的(反)序列化程序不起作用,所以我们必须编写自己的程序。那份文档一点头绪也没有! - Mark A. Donohoe
2个回答

3

JsonConvert如何知道"seq1"对应名称,而"1"对应TorrentsInLabel?请查看JsonObjectAttribute、JsonPropertyAttribute和JsonArrayAttribute。


你确定吗?它缺少合同而不是属性。我尝试在Label上放置JsonArrayAttribute,以及在Name和TorrentsInLabel上放置JsonPropertyAttrbiute,但这些属性需要属性的名称。 - grega g
你是对的。看起来,最简单的方法是在标签中实现一些集合接口 - IList或ICollection。 - darkiri
是的,但我想要从JSON数组转换为业务对象。 目前,我正在通过子类化JsonCoverter来实现解决方案,但这不会完美。 - grega g

2

默认情况下,类被序列化为 JSON 对象,其中类上的属性成为 JSON 对象上的属性。

{
    Name: "seq",
    TorrentsInLabel: 1
}

你试图将其序列化为一个数组,这不是Json.NET序列化程序默认的工作方式。
为了得到你想要的结果,你应该创建一个JsonConverter,并手动读写标签的JSON,使其成为你想要的类型(一个数组)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接