C#Linq JSON嵌套数组的奇怪行为

时间:2020-05-12 09:04:56

标签: c# json linq json.net

我一直在尝试使用C#Linq JSON库创建嵌套数组。有什么原因为什么第一种方法不起作用,而后来的一种起作用。

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时会跳过它。

2 个答案:

答案 0 :(得分:3)

这归结于“ JArray”的构造函数。

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

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

public JArray(JArray other)

other中,指出:

要复制的JArray对象。

因此,这将创建一个新的JArray作为现有副本的副本。它不会创建嵌套数组。

JArray上有other constructors确实创建了一个新的(JArray(Object content)JArray(params Object[] content)),因此您可以强制代码使用上面提到的第二个构造函数通过向(object)添加类型转换:

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

答案 1 :(得分:3)

您应该稍微更新失败的部分,并将嵌套的JArray传递给外部JArray的集合初始化程序

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

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

从另一个JArray初始化JArray类的新实例 对象。

参数

其他

类型:Newtonsoft.Json.Linq.JArray

要复制的JArray对象。

添加集合初始值设定项后,您将获得以下输出,与第二次尝试相同

  "Nested_failed": [
    [
      0,
      false,
      21
    ]
  ],
  "Nested_succeed": [
    [
      0,
      false,
      21
    ]
  ]
}
相关问题