C# Newtonsoft Jarray 添加二维数组 异常---不按套路出牌

比如

            JArray a = new JArray();

            for (int i = 0; i < 20; i++)
            {
                String s1 = i + "";
                String s2 = i + "y";
                String[] d = new string[2];
                d[0] = s1;
                d[1] = s2;
                a.Add((Object)d);

            }

我期望结果是

{[[ "0", "0y"], ["1", "1y"], ["2", "2y"], ["3", "3y"], ["4", "4y"], ["5", "5y"],......]]}

结果是
image.png
{ ["0", "0y", "1", "1y", "2", "2y", "3", "3y", "4", "4y", "5", "5y",......]}
为什么数组的中括号合并了呢?
感谢。

阅读 3.5k
2 个回答

这个实际上看下源码就明白了,你执行的 JArray.Add 方法实际上会调用 JContainer.IsMultiContent 方法去判断要添加的对象是否是可枚举的集合,如果是的话逐个处理(就是你给出的示例中的)。

public virtual void Add(object? content)
{
    TryAddInternal(ChildrenTokens.Count, content, false);
}

internal bool TryAddInternal(int index, object? content, bool skipParentCheck)
{
    if (IsMultiContent(content))
    {
        IEnumerable enumerable = (IEnumerable)content;

        int multiIndex = index;
        foreach (object c in enumerable)
        {
            TryAddInternal(multiIndex, c, skipParentCheck);
            multiIndex++;
        }

        return true;
    }
    else
    {
        JToken item = CreateFromContent(content);

        return InsertItem(index, item, skipParentCheck);
    }
}

internal bool IsMultiContent([NotNullWhen(true)]object? content)
{
    return (content is IEnumerable && !(content is string) && !(content is JToken) && !(content is byte[]));
}

想要达成你的需求,可以使用 List<object[]> 来构建后再使用 JsonConvert 来进行序列化,如下:
图片.png

可以这样:

a.Add(new JArray(d));

或者直接把 d 定义为 JAraay

或者干脆就直接用 Linq 来生成二维数组,再用 JsonConvert 来序列化成 JSON

var data = Enumerable.Range(0, 20)
    .Select(i => new string[] { $"{i}", $"{i}y" });
var json = JsonConvert.SerializeObject(data);
Console.WriteLine(json);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进