- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
XPath 2 声明选择的节点顺序应按照它们在文档中的顺序返回。当您在 JSON.Net 中选择 token (JSONPath)时,情况似乎并非如此
当我处理下面的文档时
string json = @"
{
""Files"": {
""dir1"": {
""Files"": {
""file1.1.txt"": {
""size:100""},
""file1.2.txt"": {
""size:100""}
}
},
""dir2"": {
""Files"": {
""file2.1.txt"": {
""size:100""},
""file2.2.txt"": {
""size:100""}
}
},
""file3.txt"": {
""size:100""}
}
}";
使用JSON.net SelectTokens("$..files.*")时顺序如下
dir1
dir2
file3.txt
file1.1.txt
file1.2.txt
file2.1.txt
file2.2.txt
当我期望以下顺序时(如 Xpath//files/*)
dir1
file1.1.txt
file1.2.txt
dir2
file2.1.txt
file2.2.txt
file3.txt
我应该如何编写查询以便获得 XPath 顺序的列表?
最佳答案
除了修改 Json.Net 源代码,我看不到直接控制顺序的方法 SelectTokens()
返回其结果。它似乎在使用广度优先排序。
而不是使用 SelectTokens()
,您可以将 LINQ-to-JSON 查询与 Descendants()
结合使用方法。这将按深度优先顺序返回标记。但是,您需要过滤掉您不感兴趣的属性名称,例如"file"和“大小”。
string json = @"
{
""Files"": {
""dir1"": {
""Files"": {
""file1.1.txt"": { ""size"": 100 },
""file1.2.txt"": { ""size"": 100 }
}
},
""dir2"": {
""Files"": {
""file2.1.txt"": { ""size"": 100 },
""file2.2.txt"": { ""size"": 100 }
}
},
""file3.txt"": { ""size"": 100 }
}
}";
JObject jo = JObject.Parse(json);
var files = jo.Descendants()
.OfType<JProperty>()
.Select(p => p.Name)
.Where(n => n != "Files" && n != "size")
.ToArray();
Console.WriteLine(string.Join("\n", files));
fiddle :https://dotnetfiddle.net/yRAev4
如果您不喜欢这个想法,另一种可能的解决方案是使用自定义 IComparer<T>
事后将所选属性排序回其原始文档顺序:
class JPropertyDocumentOrderComparer : IComparer<JProperty>
{
public int Compare(JProperty x, JProperty y)
{
var xa = GetAncestors(x);
var ya = GetAncestors(y);
for (int i = 0; i < xa.Count && i < ya.Count; i++)
{
if (!ReferenceEquals(xa[i], ya[i]))
{
return IndexInParent(xa[i]) - IndexInParent(ya[i]);
}
}
return xa.Count - ya.Count;
}
private List<JProperty> GetAncestors(JProperty prop)
{
return prop.AncestorsAndSelf().OfType<JProperty>().Reverse().ToList();
}
private int IndexInParent(JProperty prop)
{
int i = 0;
var parent = (JObject)prop.Parent;
foreach (JProperty p in parent.Properties())
{
if (ReferenceEquals(p, prop)) return i;
i++;
}
return -1;
}
}
像这样使用比较器:
JObject jo = JObject.Parse(json);
var files = jo.SelectTokens("$..Files")
.OfType<JObject>()
.SelectMany(j => j.Properties())
.OrderBy(p => p, new JPropertyDocumentOrderComparer())
.Select(p => p.Name)
.ToArray();
Console.WriteLine(string.Join("\n", files));
fiddle :https://dotnetfiddle.net/xhx7Kk
关于c# - JSON.net 与 XPATH : How to preserve node order in SelectTokens?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51772089/
作为 VBA 的初学者,我正在尝试临时学习大部分内容,所以请原谅我的灰尘。 我正在编写一个子例程,用于读取文本文件中的行。每行均以空格分隔,并以 ' 作为文本标识符。我要求将每一行作为多维数组分成多个
关注此 tutorial about C and gdb .这当然是一个有用的教程,但他们从这样的例子开始: (gdb) print a $1 = {1, 2, 3} (gdb) ptype a ty
我正在看别人的vba excel代码。他们在两个循环中都执行 ReDim Preserve dataMatrix(7, i) 。这是做什么的? 另外,第二个循环似乎只是覆盖了第一个循环中的数据,对吗?
我正在使用谷歌浏览器和 React.js。 编辑:这是一个带有纯 css 的 jsfiddle: https://jsfiddle.net/4jkvag25/ 我有与教程完全相同的代码,但仍然无法正常
在 python 中的代码是: list = "a123,145B,12" re.split("[a-zA-Z_]",list) 结果: ['', '123,145', ',12'] 我怎样才能保留字
我正在读取一个 XML 文件,其中有“纯空白文本节点”: I love Mozart. 在上面的(简化的)示例中,结束标记和开始标记之间有空格(一个空格)。我需要保留那个空间。 在 RapidXML
考虑这段代码(引自 geeksforgeeks.org,作者 Tushar Roy)如果从根到叶的路径具有总和为指定值的键,则计算真或假: bool hasPathSum(struct node* n
我的网页中有一个 div contenteditable。当您在 div contenteditable 中键入一些文本时,文本会在隐藏的文本区域中重现以进行后期处理(表单 method="post"
我需要从处理 .txt 期间生成的变量值填充数组文件。然而,上限取决于输入线。我怎样才能使以下事情起作用? Dim myArr As Variant ReDim Preserve myArr(1)
我有 myfile.ps包括矢量图像。 但是当我跑 ps2pdf myfile.ps 输出页面大小似乎是A4:矢量图像太大而被切掉,因此大约丢失了一英寸。 除了原始矢量图像外,输出 PDF 文件中还会
我有一个自定义的NSView,用于显示背景颜色。这有效。但是,该图像中的阴影未保留。 图像的所有透明或半透明区域都呈现为黑色。我该如何解决这个问题? - (void)drawRect:(NSRect)
如何默认启用 Chrome 开发者工具中网络工具中的“保留日志”?每次我按 F12 然后选择“网络”选项卡时,我需要单击“保留日志”复选框以使其保留请求/响应。是否可以默认一直检查? 顺便说一句,此功
一方面,维基百科写了乱序执行的步骤: Instruction fetch. Instruction dispatch to an instruction queue (also called inst
这是引用this question 。 我想重命名大型数据框中的列子集。我希望以下代码将列 X4、X5、X6 和 X7 重命名为 gradek分别为 、grade1、grade2 和 grade3:
我有以下代码将图像(位图)转换为字节数组: public byte[] ConvertImageToByteArray(Image imageToConvert, ImageFormat format
简介 我经常使用 Google Closure Compiler 来压缩我的 JavaScript 文件。现在,它似乎很好地压缩了我的代码。 现在,我尝试养成将this 对象存储在局部变量中的习惯,因
我正在尝试将 MySQL 表数据导出到 MongoDB,在 Rails 中创建一组“Create”语句。 我的问题是:在我的原始表中,我有“created_at”和“updated_at”字段,即使我
我今天做了一些实验,发现问题归结为 transform: rotateY(180deg) 和使用 transform-style: preserve-3d 的容器旋转。我将再次描述细节。原始问题在下面
希望在这里得到一些意见。 在我当前的 iOS 项目中,我使用 CoreBluetooth 和 swift。该应用程序可以在后台使用 CoreBluetooth 进行通信,这基本上可以正常工作。外围设备
我正在使用 xlrd 和 xlwt 遍历某些单元格并根据某些条件检查它们。如果他们符合我继续的标准,如果不符合,我想将文本涂成红色。不同单元格的格式会发生变化,有些具有背景颜色,有些是粗体,有些大小不
我是一名优秀的程序员,十分优秀!