C# JRaw SelectToken返回null
我正在.NETCore2.0中使用Newtonsoft.Json 11.0.2 如果我使用JObject,我可以选择Token,如下所示: 返回 42 但是,如果使用JRaw,同一路径会得到nullC# JRaw SelectToken返回null,c#,json.net,C#,Json.net,我正在.NETCore2.0中使用Newtonsoft.Json 11.0.2 如果我使用JObject,我可以选择Token,如下所示: 返回 42 但是,如果使用JRaw,同一路径会得到null new JRaw("{\"context\":{\"id\":42}}").SelectToken("context.id") 返回 空的 由于我的代码是如何设置的,我的模型已经在JRaw中了,并且将它转换为JObject只是为了选择这个令牌似乎是对RAM的浪费。这个调用是在热路径上的 更新 好的
new JRaw("{\"context\":{\"id\":42}}").SelectToken("context.id")
返回
空的
由于我的代码是如何设置的,我的模型已经在JRaw中了,并且将它转换为JObject只是为了选择这个令牌似乎是对RAM的浪费。这个调用是在热路径上的
更新
好的,我的实际数据来自一个模型,其中只有一个属性是JRaw,所以我需要以下类似的东西来工作:
JsonConvert.DeserializeObject<Dictionary<string, JRaw>>(
"{\"a\":{\"context\":{\"id\":42}}}")["a"].SelectToken("context.id")
上面的返回值再次为空。标题可能有点误导,但OP需要的基本上是一种在不消耗太多内存的情况下解析现有大型JRaw对象的方法 我运行了一些测试,并且能够使用JsonTextReader找到解决方案 我不知道OP的json字符串的确切结构,因此我假设如下:
[
{
"context": {
"id": 10
}
},
{
"context": {
"id": 20
}
},
{
"context": {
"id": 30
}
}
]
结果将是一个id值为10、20、30的整数数组
解析方法
因此,这种方法将JRaw对象作为参数,并使用JsonTextReader提取ID
测试代码
出于测试目的,我创建了以下与上述json结构匹配的C类:
public class Data
{
[JsonProperty("context")]
public Context Context { get; set; }
public Data(int id)
{
Context = new Context
{
Id = id
};
}
}
public class Context
{
[JsonProperty("id")]
public int Id { get; set; }
}
创建JRaw对象并提取ID:
class Program
{
static void Main(string[] args)
{
JRaw rawJson = CreateRawJson();
List<int> ids = GetIds(rawJson).ToList();
Console.Read();
}
// Instantiates 1 million Data objects and then creates a JRaw object
private static JRaw CreateRawJson()
{
var data = new List<Data>();
for (int i = 1; i <= 1_000_000; i++)
{
data.Add(new Data(i));
}
string json = JsonConvert.SerializeObject(data);
return new JRaw(json);
}
}
内存使用
使用Visual Studio的诊断工具,我拍摄了以下快照,以检查内存使用情况:
快照1按预期在控制台应用程序内存不足的开始处拍摄
快照2是在创建JRaw对象后拍摄的
JRaw rawJson=CreateRawJson
快照3是在提取ID后拍摄的
List id=GetIdsrawJson.ToList
试试这个=>JRaw.Parse{\context\:{\id\:42}}。SelectTokencontext.id与=>JToken.Parse{\context\:{\id\:42}相同。SelectTokencontext.id;您可以使用以上两种方法从原始数据获取特定令牌json@ershoaib很不错的!不幸的是,这突出表明我过于简化了提供的示例,请参阅更新。我认为不可能将.SelectToken与JRaw实例一起使用。@RuiJarimba但该方法位于类:?
if (textReader.TokenType == JsonToken.Integer && textReader.Path.EndsWith("context.id"))
{
int id = Convert.ToInt32(textReader.Value);
yield return id;
}
public class Data
{
[JsonProperty("context")]
public Context Context { get; set; }
public Data(int id)
{
Context = new Context
{
Id = id
};
}
}
public class Context
{
[JsonProperty("id")]
public int Id { get; set; }
}
class Program
{
static void Main(string[] args)
{
JRaw rawJson = CreateRawJson();
List<int> ids = GetIds(rawJson).ToList();
Console.Read();
}
// Instantiates 1 million Data objects and then creates a JRaw object
private static JRaw CreateRawJson()
{
var data = new List<Data>();
for (int i = 1; i <= 1_000_000; i++)
{
data.Add(new Data(i));
}
string json = JsonConvert.SerializeObject(data);
return new JRaw(json);
}
}