【发布时间】:2014-10-05 17:25:38
【问题描述】:
所以我需要将复合序列化为 JSON(使用 JSON.NET),并希望带着这个问题来到这里会是一个快速的胜利。
我有一个非常基本的复合实现,我只是想用它来搭建我的服务和数据结构,但 JSONSerializer 只是序列化根节点。
代码:
namespace Data
{
public abstract class Element
{
protected string _name;
public Element(string name)
{
_name = name;
}
public abstract void Add(Element element);
public string Name { get { return _name; } }
}
public class ConcreteElement : Element
{
public ConcreteElement(string name) : base(name) { }
public override void Add(Element element)
{
throw new InvalidOperationException("ConcreteElements may not contain Child nodes. Perhaps you intended to add this to a Composite");
}
}
public class Composite: Element
{
public Composite(string name) : base(name) { Elements = new List<Element>(); }
private List<Element> Elements { get; set; }
public override void Add(Element element)
{
Elements.Add(element);
}
}
}
在我的 Controller 的 HttpGet 方法中,
Composite root = new Composite("Root");
Composite branch = new Composite("Branch");
branch.Add(new ConcreteElement("Leaf1"));
branch.Add(new ConcreteElement("Leaf2"));
root.Add(branch);
return JsonConvert.SerializeObject(root);
唯一被序列化的是
{"Name\":\"Root\"}"
谁能看出这不是序列化子元素的原因? 我希望这是愚蠢的。
编辑1
我以前从未尝试使用 WebAPI 将图形序列化为 JSON。我是否需要编写自定义 MediaTypeFormatter 来序列化它?
Edit2(添加所需的输出)
Leaf1 和 Leaf2 目前只是标记。一旦我可以对其进行序列化,它们本身就是复杂的对象。 所以,此刻……
{
"Name" : "Root"
,"Branch":
[
{"Name":"Leaf1"}
,{"Name":"Leaf2"}
]
]
}
最终
{
"Name" : "Root"
,"Branch1":
[
{"Name":"Leaf1", "Foo":"Bar"}
{"Name":"Leaf2", "Foo":"Baz"}
]
,"Branch2":
[
"Branch3":[
{"Name":"Leaf3", "Foo":"Quux"}
]
]
}
【问题讨论】:
-
我看到的一个问题是您的元素列表是私有的。 Json.Net 默认不会序列化私有成员。如果你用
[JsonProperty("Elements")]标记它,它将开始序列化它。但是,预期的 JSON 输出是什么?您可能需要一个转换器,具体取决于您实际希望 JSON 的样子。 -
您不需要自定义 MediaTypeFormatter 来序列化对象图。
-
@BrianRogers 回复:“预期的 JSON 输出”我需要给分支的名称作为根的子元素的属性名称。和终端节点是复杂的数据对象。转换器?
-
@BrianRogers 和 btw...Elements 上的私有修饰符是罪魁祸首。我在通过代码时忽略了它,并立即将代码扔到这里以供审查。
-
是的,要使元素列表的属性名称根据组合名称更改,您需要一个转换器。您需要这方面的帮助吗?或者您对此有帮助吗?
标签: c# json serialization asp.net-web-api json.net