繁体   English   中英

C# Linq JSON 嵌套 arrays 奇怪的行为

[英]C# Linq JSON nested arrays strange behaviour

我一直在尝试使用 C# Linq Z0ECD11C1D7A287401D148A2F8 库创建嵌套的 arrays 是否有某种原因导致第一种方法不起作用但后一种方法起作用。

using System;
using Newtonsoft.Json.Linq;

public class Program
{
    public static void Main()
    {       
        JObject jo = new JObject();

        // Linq-way
        jo.Add(new JProperty("Nested_failed", new JArray(
            new JArray(
                new JValue(0),
                new JValue(false),
                new JValue(21)
                    )
                )
            )
        );

        // Second try
        JArray nested = new JArray();
        nested.Add(new JArray(
            new JValue(0), 
            new JValue(false), 
            new JValue(21)
            )
        );
        jo.Add(new JProperty("Nested_succeed",nested));

        Console.WriteLine(jo.ToString());   
    }
}

结果这个

{
  "Nested_failed": [
    0,
    false,
    21
  ],
  "Nested_succeed": [
    [
      0,
      false,
      21
    ]
  ]
}

据我所知,两种方式都应该得到相同的结果。 但是由于某种原因,当您以“Linq-way”构造它时,会跳过嵌套的 JArray。

它归结为“JArray”的构造函数。

    // Linq-way
    jo.Add(new JProperty("Nested_failed", new JArray(
        new JArray(
            new JValue(0),
            new JValue(false),
            new JValue(21)
                )
            )
        )
    );

在上面的第一个示例中,您正在从现有的JArray JArray 文档为在这种情况下选择的构造函数提供了以下签名:

public JArray(JArray other)

以及other ,状态:

要从中复制的 JArray object。

所以这会创建一个新的JArray作为现有 JArray 的副本。 它不会创建嵌套数组。

JArray上还有其他构造函数会创建一个新构造函数( JArray(Object content)JArray(params Object[] content) ),因此您可以通过向(object) ) 添加强制转换来强制代码使用我上面提到的第二个构造函数(object) :

    // Linq-way
    jo.Add(new JProperty("Nested_failed", new JArray(
        (object)new JArray(
            new JValue(0),
            new JValue(false),
            new JValue(21)
                )
            )
        )
    );

您应该稍微更新失败的部分并将嵌套的JArray传递给外部JArray的集合初始值设定项

jo.Add(new JProperty("Nested_failed", 
    new JArray
    {
        new JArray(new JValue(0), new JValue(false), new JValue(21))
    }
));

JArray ctor接受一个参数,该参数用于从中复制值,而不是用于将其添加为嵌套值

从另一个JArray object 初始化JArray class 的新实例。

参数

其他

类型: Newtonsoft.Json.Linq.JArray

要从中复制的JArray object。

添加集合初始化程序后,您将得到以下 output,与第二次尝试相同

  "Nested_failed": [
    [
      0,
      false,
      21
    ]
  ],
  "Nested_succeed": [
    [
      0,
      false,
      21
    ]
  ]
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM