Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# JRaw SelectToken返回null_C#_Json.net - Fatal编程技术网

C# JRaw SelectToken返回null

C# 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的浪费。这个调用是在热路径上的 更新 好的

我正在.NETCore2.0中使用Newtonsoft.Json 11.0.2

如果我使用JObject,我可以选择Token,如下所示:

返回

42

但是,如果使用JRaw,同一路径会得到null

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);
    }
}