我正在尝试对具有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提前感谢。
2条答案
按热度按时间ygya80vv1#
要在C#中从JSON树视图中删除({object},{Array})等项,可以创建一个递归函数,遍历JSON数据并删除类型为“Object”或“Array”的节点。
93ze6v8z2#
您当前的解决方案实际上并没有修改树的结构,它只是修改了表示对象或数组的节点的文本。
我理解 * 为什么 * 你想做你想做的事情:使树更紧凑,并且,也许,更“视觉上吸引人”。但是,这会导致“保真度”的损失。没有
{object}
和{array}
节点会删除有关属性实际值的信息:对象或数组(an answer到另一个问题会更详细地解释它)。这将迫使您的用户承担隐含地知道
JSON
是一个对象(因为它下面的节点只是命名属性)和ANIMALS
是一个数组(因为它下面的节点被索引为[0]
、[1]
等)的认知负担。这发生在“树构建时”,而不是在“树可视化”步骤。这两段代码(1,2)...
1.创建并返回与
JToken
关联的TreeNode
,JToken
是JObject
或JArray
,它们分别是{}
(对象)和[]
(数组)的标记。1.在可视化时,呈现为带有文本
{object}
或[array]
的单个TreeNode
。如果您不介意认知负担,则需要更改引用的代码,以返回一个
IEnumerable<TreeNode>
,而不是单个TreeNode
。像这样修改JsonTreeNodeFactory.cs
我可以这样做,但是您必须更改调用站点以将可枚举节点添加到树中(例如,使用
AddRange()
而不是使用Add()
的单个add)。**注意:**上面的代码 * 没有 * 经过测试,但它至少应该是足够的伪代码,可以给予您大致了解要做什么。
如果这样做,就必须设法将其导出回JSON,必须以某种方式“不可见地存储”* 真实的 * 上下文--丢失的节点是对象还是数组。
我把那部分留给你。