【问题标题】:C# Linq JSON nested arrays strange behaviourC# Linq JSON 嵌套数组的奇怪行为
【发布时间】:2020-05-12 09:04:56
【问题描述】:

我一直在尝试使用 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。

【问题讨论】:

    标签: c# json linq json.net


    【解决方案1】:

    归结为 `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 的副本。它不会创建嵌套数组。

    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)
                    )
                )
            )
        );
    

    【讨论】:

    • 谢谢!我把它作为一个公认的答案,因为你早些时候发布了它。这一点现在很明显。花了几个小时想知道为什么我的代码昨晚没有按预期工作。
    【解决方案2】:

    您应该稍微更新失败的部分并将嵌套的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
        ]
      ]
    }
    

    【讨论】:

    • 啊,当然……为什么我没有想到使用collection initializer pattern?哦好吧?
    • 谢谢!我一直在用这个撞墙很长一段时间,但现在看起来很明显。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多