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

发布于 2022-09-12 22:49:29 字数 675 浏览 14 评论 0

比如

            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",......]}
为什么数组的中括号合并了呢?
感谢。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

帅的被狗咬 2022-09-19 22:49:29

这个实际上看下源码就明白了,你执行的 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

┾廆蒐ゝ 2022-09-19 22:49:29

可以这样:

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);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文