非固定长度的后视解决方法

时间:2017-06-27 05:38:09

标签: c# json regex

考虑以下JSON:
第1名:

{
  "Good": {
    "a": "<good>",
    "c": "<better>",
    "e": "<best>"
  },
  "Bad": {
    "a": "<bad>",
    "c": "<worse>",
    "e": "<worst>"
  }
}

第二名:

{
  "Good": {
    "a": "<kind of good>",
    "c": "<more good>",
    "e": "<the most good>"
  },
  "Bad": {
    "a": "<a little bad>",
    "c": "<more bad>",
    "e": "<the most bad>"
  }
}

第3名:

{
  "Good": {
    "a": "<good>",
    "c": "<better>",
    "e": "<best>"
  },
  "Bad": {
    "a": "<bad>",
    "c": "<better>",
    "e": "<worst>"
  }
}

在所有情况下,我都必须提取财产&#34; c&#34;并且它来自对象&#34; Good&#34;的值,用值进行一些操作,然后用新值替换旧值。

问题在于对象&#34; Bad&#34;。我对那个对象的价值不感兴趣,我不应该替换那里的任何东西 到目前为止,我想出了那个正则表达式:

(?<!Bad)"c": "(<.*?>)"

明显的问题是对象的名称&#34; Bad&#34;不在财产之前&#34; c&#34;马上,may(和will)之间的符号不同。并且,据我所知,lookbehind应该是固定的长度,所以我不能使用这样的东西:

(?<!Bad.*)"c": "(<.*?>)"

我在C#中使用正则表达式,所以我想到了第一次出现,但它不是最可靠的解决方案,它仍然无法解决更换问题。

谈论替换。我想过动态创建正则表达式以确保只替换正确的事件。但是对于第三个例子,这个技巧不会起作用,因为"c": "(<better>)"会匹配对象和#34; Good&#34;和&#34;坏&#34;。

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

您可以使用JSON.NET来解析JSON。既然你知道JSON中有一定的值,你可以使用一个简单的代码(这里只是用括号括起e值):

dynamic parsedObject = Newtonsoft.Json.JsonConvert.DeserializeObject(data);
parsedObject["Good"]["e"] = $"({parsedObject["Good"]["e"]})";
var res = parsedObject.ToString();

enter image description here