gpt4 book ai didi

c# - 使用 JsonReader 时有没有办法倒带或后退?

转载 作者:行者123 更新时间:2023-12-04 13:42:14 24 4
gpt4 key购买 nike

我试图从 JSON 对象输入流中读取第一个属性名称,然后根据它的值,可能“倒带”并读取整个对象。

我可以轻松读取第一个属性名称,例如

JsonReader reader = ...;
while (reader.Read()) {
if (reader.TokenType == JsonToken.PropertyName) {
// this is the first property
break;
}
}

但我看不出有任何方法可以让读者后退或倒带。

虽然我知道底层流可能不支持较低级别的搜索,但我希望我们已经阅读的 JSON token 可以以某种方式倒带和重新解析。

如果这是不可能的,或者有什么方法可以只读取对象的属性名称而不解析每个属性的内容?我想避免为了检查一个属性而阅读整个内容两次。

最佳答案

JsonReader 是一个只进阅读器。没有完全从头开始,就没有办法“倒带”或回到更早的阶段。如果您希望能够看到较早的信息,则需要在阅读时将其存储到变量中。
JsonReader确实提供了 Skip 可用于跳过特定 token 的子代的方法。因此,如果您读取不感兴趣的属性名称,并且下一个标记是对象或数组的开头,则可以使用 Skip直接移动到该对象或数组的结束标记。

下面是一个简单的示例,它使用此技术仅读取 JSON 对象的根属性名称,但跳过所有值。

string json = @"
{
""resultCode"": 200,
""message"": ""OK"",
""searchTerms"": [
{
""attribute"": ""keywords"",
""operator"": ""contains"",
""values"": [ ""ipsum"" ]
}
],
""count"": 2,
""items"": [
{
""id"": 1,
""name"": ""foo"",
""sizes"": [ ""small"", ""meduim"", ""large"" ],
""description"": ""Lorem ipsum dolor sit amet""
},
{
""id"": 2,
""name"": ""bar"",
""sizes"": [ ""tiny"", ""huge"" ],
""description"": ""Neque porro quisquam est qui dolorem ipsum""
}
]
}";

using (StringReader sr = new StringReader(json))
using (JsonTextReader reader = new JsonTextReader(sr))
{
while (reader.Read())
{
if (reader.TokenType == JsonToken.PropertyName)
{
string propName = (string)reader.Value;
Console.WriteLine(propName);

// advance to property value
reader.Read();

// if the value is an object or array, skip over its children
if (reader.TokenType == JsonToken.StartObject ||
reader.TokenType == JsonToken.StartArray)
reader.Skip();
}
}
}

输出:
resultCode
message
searchTerms
count
items

fiddle : https://dotnetfiddle.net/qfejWk

关于c# - 使用 JsonReader 时有没有办法倒带或后退?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39292135/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com