json 如何在树视图C#中删除不必要的项({object}、{Array}

zujrkrfu  于 2023-02-26  发布在  C#
关注(0)|答案(2)|浏览(198)

我正在尝试对具有MIT许可证的基于C#的开源Json编辑器进行更改。我希望从Json树视图中删除({object},{Array})等项。这是指向开源Json编辑器的link,这是指向我用作预期输出引用的编辑器的link
Test.json

{
    "TEST JSON" : "JSON",
    "JSON":{
        "ANIMALS":[
            {
                "ID":0,
                "TYPE":"DOG",
                "DOG":{
                    "TYPE":"RETRIEVER",
                    "RETRIEVER":{
                        "NAME":"LEO",
                        "AGE":3,
                        "YEARS":[2019 , 2020, 2021],
                        "WEIGHTS": [2,10,13]
                    }
                },
                "REMARKS":{
                    "ID":1,
                    "STATUS":"GOOD",
                    "REFERENCE": {
                        "SOURCE": "XYZ",
                        "FIT":  1,
                        "BMI" : 1
                    }
                }
            },
            {
                "ID":1,
                "TYPE":"DOG2",
                "DOG2":{
                    "TYPE":"PUG",
                    "RETRIEVER":{
                        "NAME":"HUTCH",
                        "AGE":4,
                        "YEARS":[2019 , 2020, 2021, 2022],
                        "WEIGHTS": [2,3,4,4]
                    }
                },
                "REMARKS":{
                    "ID":1,
                    "TYPE" : "REFERENCE",
                    "STATUS":"OK",
                    "REFERENCE": {
                        "SOURCE": "XYZ",
                        "FIT":  1,
                        "BMI" : 1
                    }
                }
            },
            {
                "ID": 2,
                "TYPE": "DIAGNOSTICS",
                "STATUS": "ENABLED"
            },
            {
                "ID": 3,
                "TYPE": "ORGANISATION",
                "ORGANISATION":{
                    "NAME":"RED CROSS",
                    "YEAR": 2023
                }
            }
        ]
    }
}

电流输出x1c 0d1x
如下图所示,我想删除标记为红色的元素,使它看起来像右边的图像
预期输出

在解决方案JsonEditor和JsonTreeview中有2个项目。在所有这些文件

中有一个名为AfterExpand()的函数。我确信该函数负责显示那些不需要的项目。因此,我在所有文件中将文本字符串留空,这样这些项目就会消失。

/// <inheritdoc />
        public override void AfterExpand()
        {
            base.AfterExpand();

            Text = $@"[{JArrayTag.Type}]";
// change i made 
            Text = "";
        }

但是现在好像有空位在显示。2任何帮助都将非常感激。3提前感谢。

ygya80vv

ygya80vv1#

要在C#中从JSON树视图中删除({object},{Array})等项,可以创建一个递归函数,遍历JSON数据并删除类型为“Object”或“Array”的节点。

using Newtonsoft.Json.Linq;

public void RemoveObjectAndArrayNodes(JToken node)
{
    if (node.Type == JTokenType.Object || node.Type == JTokenType.Array)
    {
        node.Replace(new JObject());
    }
    else
    {
        foreach (var child in node.Children())
        {
            RemoveObjectAndArrayNodes(child);
        }
    }
}
93ze6v8z

93ze6v8z2#

您当前的解决方案实际上并没有修改树的结构,它只是修改了表示对象或数组的节点的文本。
我理解 * 为什么 * 你想做你想做的事情:使树更紧凑,并且,也许,更“视觉上吸引人”。但是,这会导致“保真度”的损失。没有{object}{array}节点会删除有关属性实际值的信息:对象或数组(an answer到另一个问题会更详细地解释它)。
这将迫使您的用户承担隐含地知道JSON是一个对象(因为它下面的节点只是命名属性)和ANIMALS是一个数组(因为它下面的节点被索引为[0][1]等)的认知负担。
这发生在“树构建时”,而不是在“树可视化”步骤。这两段代码(1,2)...
1.创建并返回与JToken关联的TreeNodeJTokenJObjectJArray,它们分别是{}(对象)和[](数组)的标记。
1.在可视化时,呈现为带有文本{object}[array]的单个TreeNode
如果您不介意认知负担,则需要更改引用的代码,以返回一个IEnumerable<TreeNode>,而不是单个TreeNode
像这样修改JsonTreeNodeFactory.cs

public static IEnumerable<TreeNode> Create(JArray obj, int depth)
{
    // don't need this anymore
    // var node = new JArrayTreeNode(obj);

    if (depth != 1)
    {
        int remainingDepth = (depth == UnlimitedDepth ? UnlimitedDepth : depth - 1);
        return obj
            .Select(o => Create((dynamic)o, remainingDepth))
            .Cast<TreeNode>()
            .ToArray();
    }

    return Array.Empty<TreeNode>();
}

public static IEnumerable<TreeNode> Create(JObject obj, int depth)
{
    // don't need this anymore
    // var node = new JObjectTreeNode(obj);

    if (depth != 1)
    {
        int remainingDepth = (depth == UnlimitedDepth ? UnlimitedDepth : depth - 1);
        return obj.Properties()
            .Select(o => Create(o, remainingDepth))
            .ToArray();
    }

    return Array.Empty<TreeNode>();
}

我可以这样做,但是您必须更改调用站点以将可枚举节点添加到树中(例如,使用AddRange()而不是使用Add()的单个add)。

**注意:**上面的代码 * 没有 * 经过测试,但它至少应该是足够的伪代码,可以给予您大致了解要做什么。

如果这样做,就必须设法将其导出回JSON,必须以某种方式“不可见地存储”* 真实的 * 上下文--丢失的节点是对象还是数组。
我把那部分留给你。

相关问题