从JSONPath构建JObject

时间:2017-05-15 20:36:38

标签: c# json.net

对于使用适用于.NET的Newtonsoft JSON库,我有点新鲜。有没有办法从JSONPath创建JObject或JToken?

例如,如下所示。

string jsonPath = "$.ArrayA[0].ArrayB[0].Property";
JObject jObj = JObject.FromJSONPath(jsonPath); // SOMETHING LIKE THIS

结果将是一个看起来像这样的JObject或JToken。

{
    "ArrayA": [{
        "ArrayB": [{
            "Property": ""
        }]
    }
}

1 个答案:

答案 0 :(得分:2)

如果您有一些现有的JSON,您可以将其解析为JToken,然后选择一个或多个后代JTokens使用SelectTokenSelectTokens并{{ 3}}。例如:

string json = @"{ ""ArrayA"": [{ ""ArrayB"": [{ ""Property"": ""foo"" }] }] }";
JToken token = JToken.Parse(json);
JToken fooToken = token.SelectToken("$..Property");
Console.WriteLine(fooToken.ToString());    // prints "foo"

您也可以手动构建JTokens的嵌套结构。例如,您可以在问题中创建JObject,如下所示:

var obj = new JObject(new JProperty("ArrayA", new JArray(
             new JObject(new JProperty("ArrayB", new JArray(
                new JObject(new JProperty("Property", ""))))))));

但是,除了JsonPath表达式之外,没有内置的方法来创建JToken。您需要使用自己的方法来执行类似的操作。但请记住,JsonPath被设计为查询机制;它没有干净地映射到新对象的创建。以下是您需要考虑的一些问题:

  • 在示例表达式$.ArrayA[0].ArrayB[0].Property中,Property是什么类型的?是字符串,数字,布尔值,对象还是空数组?你会如何指定?
  • 您如何指定具有多个属性的对象的创建?
  • $..book[(@.length-1)]这样的表达式会创建什么?