如何检查特定范围的键是否存在于json字符串中

时间:2019-05-03 01:51:27

标签: c# json

我有以下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

1 个答案:

答案 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}";

选项1

var isOutOfRange = Regex.Matches(input, @"""-?\d+""")
                        .Cast<Match>()
                        .Select(x => int.Parse(x.Value.Trim('"')))
                        .Any(x => x < 1 || x > 150);

说明

enter image description here

enter image description here


选项2

带有正向后方()(删除了行情

var isOutOfRange = Regex.Matches(input, @"(?<="")-?\d+(?<!"")")
                        .Cast<Match>()
                        .Select(x => int.Parse(x.Value))
                        .Any(x => x < 1 || x > 150);

说明

enter image description here

更新

根据评论Jimi,建议在其中一个值用引号引起来的情况下,检查冒号可能是明智的选择

在这种情况下,您可以将模式修改为以下内容

"-?\d+"(?=:)
(?<=")-?\d+(?<!":)