为什么JSON.Net会修改原始JObject?

时间:2019-10-01 18:31:19

标签: c# json.net

我试图理解为什么JSON.Net在添加JArray和JObject的以下两种情况下会修改原始JObject(formSchema) 我定义为vars的对象。

我假设我创建的两个var本身就是独立对象,但看起来它们不是。

在第一种情况下,requiredItems是一个JArray变量,我想在其中将令牌“ certification”添加到formSchema中,但是我放置了Add方法 在requiredItems上。不是formSchema。

在第二种情况下,我使用对ConsertProps的Add方法将certifyProperty添加到formSchema。方便地将属性添加到formSchema 没有直接引用。

这是为什么?它们是否链接在内存中?这在JSON.Net文档中的何处进行了解释?我找不到它。

namespace JSONProps
{
  class Program
  {
    static void Main(string[] args)
    {
      string jsonSchema = @"
            {
              ""jsonSchema"": {
                ""type"": ""object"",
                ""title"": ""a title"",
                ""properties"": {
                  ""consent"": {
                    ""type"": ""object"",
                    ""title"": ""Consent of Applicant"",
                    ""required"": [
                      ""applicantConsent""
                    ],
                    ""properties"": {
                      ""applicantConsent"": {
                        ""type"": ""boolean"",
                        ""title"": ""I give my Consent"",
                      },
                    }
                  }
                }
            }
          }
        ";

      // First case
      var formSchema = JObject.Parse(jsonSchema);
      var requiredProps = formSchema["jsonSchema"]["properties"]["consent"]["required"] as JArray;
      requiredProps.Add("certification");

      // Second case
      var consentProps = formSchema["jsonSchema"]["properties"]["consent"]["properties"] as JObject;
      var certifyProperty = JObject.Parse(@" { ""type"" : ""boolean"", ""title"" : ""This is true.""  } ");
      consentProps.Add("certification", certifyProperty);
      Console.WriteLine(formSchema.ToString());
    }
  }
}
$ dotnet run
{
  "jsonSchema": {
    "type": "object",
    "title": "a title",
    "properties": {
      "consent": {
        "type": "object",
        "title": "Consent of Applicant",
        "required": [
          "applicantConsent",
          "certification"
        ],
        "properties": {
          "applicantConsent": {
            "type": "boolean",
            "title": "I give my Consent"
          },
          "certification": {
            "type": "boolean",
            "title": "This is true."
          }
        }
      }
    }
  }
}

0 个答案:

没有答案