首页 > 解决方案 > 如果值与给定模式匹配,则查找 JToken

问题描述

我试图在 JArray 中找到任何 JToken 值与__.

JArray 是这样的,如果知道 Key 则更容易,即如果给text定为 key,我可以找到所有 JToken,但如果我尝试通过 key 未知的值来解决。无法适应那段代码

"annotations": [
    {
      "align": "right",
      "axref": "x",
      "ayref": "y2",
      "font": {
        "size": 12,
        "family": "Arial,Helvetica,sans-serif"
      },
      "showarrow": false,
      "text": "D16-__m__0",
      "x": 1,
      "xanchor": "right",
      "xref": "paper",
      "y": 16,
      "yanchor": "top",
      "yref": "y2"
    },
    {
      "showarrow": false,
      "font": {
        "size": 12,
        "family": "Arial,Helvetica,sans-serif"
      },
      "text": "Something",
      "textangle": -90,
      "x": "__gh__",
      "xanchor": "right",
      "y": 0.5,
      "yanchor": "middle",
      "yref": "paper"
    }
  ]

我尝试过这样的事情,但我不知道该怎么做。

destination["annotations"] .Children<JObject>().Where(x => x?["text"] != null && x["text"].Value<string>().Contains($"__{somevalue}__"))
                                                             

但这给出了错误

destination["annotations"].Children().Where(x => x.Value<string>().Contains($"__{somevalue}__")))

标签: c#jsonjson.net

解决方案


您可以Descendants()在此处使用方法,获取所有属性并通过检查__值中的字符串来过滤它们

var json = JObject.Parse(jsonString);

var result = json.Descendants().OfType<JProperty>().Where(p =>
    p.Value.Type == JTokenType.String && p.Value.Value<string>().Contains("__"));

推荐阅读