C# 嵌套的json对象不会使用json.NET更新/继承

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

使用折旧后的System.Json,我得到了我期望的结果(来自Javascript): 孩子有了孙子,所有的父母都知道

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
    。我不确定这是否或在何处有文档记录,但从for
    JContainer
    -查找调用
    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);