C# 嵌套的json对象不会使用json.NET更新/继承
使用折旧后的System.Json,我得到了我期望的结果(来自Javascript): 孩子有了孙子,所有的父母都知道C# 嵌套的json对象不会使用json.NET更新/继承,c#,json,C#,Json,使用折旧后的System.Json,我得到了我期望的结果(来自Javascript): 孩子有了孙子,所有的父母都知道 var Parents = new JsonObject(); var Children = new JsonObject(); var Parent = JsonArray.Parse("[]"); Parents.Add("1", Parent); var Child = JsonArray.Parse
var Parents = new JsonObject();
var Children = new JsonObject();
var Parent = JsonArray.Parse("[]");
Parents.Add("1", Parent);
var Child = JsonArray.Parse("[]");
Children.Add("1", Child);
var DstParent = (JsonArray)Parents["1"];
DstParent.Add(Children["1"]);
var DstChild = (JsonArray)Children["1"];
JsonObject GrandChild = (JsonObject)JsonArray.Parse("{}");
GrandChild.Add("Age", 15);
DstChild.Add(GrandChild);
var Result = Parents.ToString();
给我:“{”1:[[{“年龄”:15}]}”
使用Newtonsoft.Json 6.0.8,家长不会得到孩子有孙子的“提示”
var Parents = new JObject();
var Children = new JObject();
var Parent = JArray.Parse("[]");
Parents.Add("1", Parent);
var Child = JArray.Parse("[]");
Children.Add("1", Child);
var DstParent = (JArray)Parents["1"];
DstParent.Add(Children["1"]);
var DstChild = (JArray)Children["1"];
var GrandChild = JObject.Parse("{}");
GrandChild.Add("Age", 15);
DstChild.Add(GrandChild);
给我:“{”1:[[]]}”
我做错了什么?问题出现了,因为所有对象都有一个属性记录它们在JSON对象层次结构中的位置——但您正试图将您的
JArray子对象添加到两个不同的不相关父对象。首先将其添加到子对象
对象(实际上不在您创建的JSON对象树中):
接下来,将其添加到DstParent
数组(位于您正在创建的JSON对象树中):
那么,Json.NET在这种情况下做什么呢?它可以:
尝试创建多重父对象时引发异常,或
从以前的父对象中删除对象并将其移动到新父对象,或
在对象的新父对象中创建对象的克隆
结果,它采用了选项3:它将子项[“1”]
复制到dstpresent
。我不确定这是否或在何处有文档记录,但从forJContainer
-查找调用EnsureParentToken
的InsertItem
可以明显看出这一点。因此,当您将孙子添加到DstChild
时,您是将其添加到原始数组,而不是副本。通过添加以下调试代码可以看到这一点:
Debug.WriteLine(object.ReferenceEquals(DstParent[0], DstChild)); //prints False
简单的解决方法是避免创建完全不必要的子对象
:
var parentObj = new JObject();
var parentArray = new JArray();
parentObj.Add("1", parentArray);
var childArray = new JArray();
parentArray.Add(childArray);
var grandChild = new JObject();
grandChild.Add("Age", 15);
childArray.Add(grandChild);
谢谢你的回答。来自javascript,向多个父对象添加对象不会克隆该对象。计划是,创建横向工作的函数,例如为所有家长或所有孩子。因此,我也将对象添加到这些对象中……您向我展示了,我应该更深入地了解c,而不是像javascript一样尝试使用c。谢谢,有点不同,但这最终帮助我解决了添加嵌套对象的问题,而不必反序列化整件事。
Debug.WriteLine(object.ReferenceEquals(DstParent[0], DstChild)); //prints False
var parentObj = new JObject();
var parentArray = new JArray();
parentObj.Add("1", parentArray);
var childArray = new JArray();
parentArray.Add(childArray);
var grandChild = new JObject();
grandChild.Add("Age", 15);
childArray.Add(grandChild);