拆分 JSON 数组中的值

Splitting of values in a JSON array

我的 json ["[\"~:bbl:P5085\",\"~:cosco:NoTag\"]"] 进来了

options.Type1.Values()

我试图只保留 bbl 附带的值,所以从上面我想保留 P5085 并删除所有值,这里可以有多个 bbl 值,我需要保留所有值。我尝试了下面的代码,但它不起作用。分裂给了我

P5085","~:cosco

我不明白我在下面的代码中做错了什么。有人可以在这里提供修复吗?

private void InitializePayload(JsonTranslatorOptions options)
        {
            _payload.Add("ubsub:attributes", _attributes);
            _payload.Add("ubsub:relations", _relations);
            JArray newType = new JArray();
            foreach (JValue elem in options.Type1.Values())
            {
                if (elem.ToString().Contains("rdl"))
                {
                    string val = elem.ToString().Split(":")[1];
                    newType.Add(val);
                }                   
               
            }           
            _payload.Add("ubsub:type", newType);
        }

正如我在评论中解释的那样,这不是 JSON,除了在顶层是一个具有单个字符串值的数组。 specific 字符串本身可以解析为 JSON 数组,但它的值不能以任何方式作为 JSON 处理。它们只是字符串。

虽然您可以尝试解析和拆分该字符串,但找到该格式的实际规范并为其编写解析器会 很多 更安全。或者为 API.

找一个图书馆

您可以使用以下代码进行解析,但它很慢,可读性差,并且基于很容易破坏的假设 - 如果值包含冒号会怎样?

foreach(var longString in JArray.Parse(input))
{
   foreach(var smallString in JArray.Parse(longString))
   {
      var values=smallString.Split(":");
      if(values[1]=="bbl")
      {
          return values[2];
      }
   }
}
return null;

您可以将其转换为 LINQ,但这同样难以阅读:

var value=JArray.Parse(input)
                .SelectMany(longString=>JArray.Parse(longString))
                .Select(smallString=>smallString.Split(":"))
                .Where(values=>values[1]=="bbl")
                .Select(values=>values[2])
                .FirstOrDefault();

试试这个:

var input = "['[\"~:bbl:P5085\",\"~:cosco:NoTag\"]']";

var BBLs_List = JArray.Parse(input)
                      .SelectMany(m => JArray.Parse(m.ToString()))
                      .Select(s => s.ToString().Split(":"))
                      .Where(w => w[1] == "bbl")
                      .Select(s => s[2])
                      .ToList();