我有以下json字符串数据作为输入:
string json="{"-1":0,"78":6,"79":6,"80":2,"81":16777215,"82":16777215,"83":1,"84":0,"85":0,"86":"2023/05/07","87":0,"88":0,"89":1,"90":1,"124":1,"16":5,"17":null,"18":null,"19":0,"20":2,"21":2000,"22":0,"23":0,"24":0,"25":0,"26":0,"109":0,"110":0,"29":0,"30":0,"31":0,"32":2000,"33":13710,"34":15710,"135":null}"
我想检查上面的任何键是否具有从1到150以外的键,以便它可以返回false。如何在C#中实现这一目标。 **条件:我不想在这里使用Json Deserializer。我已经尝试过jSon.Contains("\"-1\":")
这仅适用于一个键,即-1。相反,我想要的是1到150
答案 0 :(得分:2)
理想情况下,您不会尝试解析自己的内容,但是由于您不能使用解析器,因此我想您可以使用Regex
给出
var input = "{\"-1\":0,\"78\":6,\"79\":6,\"80\":2,\"81\":16777215,\"82\":16777215,\"83\":1,\"84\":0,\"85\":0,\"86\":\"2023/05/07\",\"87\":0,\"88\":0,\"89\":1,\"90\":1,\"124\":1,\"16\":5,\"17\":null,\"18\":null,\"19\":0,\"20\":2,\"21\":2000,\"22\":0,\"23\":0,\"24\":0,\"25\":0,\"26\":0,\"109\":0,\"110\":0,\"29\":0,\"30\":0,\"31\":0,\"32\":2000,\"33\":13710,\"34\":15710,\"135\":null}";
var isOutOfRange = Regex.Matches(input, @"""-?\d+""")
.Cast<Match>()
.Select(x => int.Parse(x.Value.Trim('"')))
.Any(x => x < 1 || x > 150);
说明
带有负和正向后方()(删除了行情)
var isOutOfRange = Regex.Matches(input, @"(?<="")-?\d+(?<!"")")
.Cast<Match>()
.Select(x => int.Parse(x.Value))
.Any(x => x < 1 || x > 150);
说明
更新
根据评论Jimi,建议在其中一个值用引号引起来的情况下,检查冒号可能是明智的选择
在这种情况下,您可以将模式修改为以下内容
"-?\d+"(?=:)
(?<=")-?\d+(?<!":)