从.net中的字符串中提取JSON

本文关键字:提取 JSON 字符串 net | 更新日期: 2023-09-27 18:15:58

输入字符串是一些文本与有效的混合 JSON:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<TITLE>Title</TITLE>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<META HTTP-EQUIV="Content-language" CONTENT="en">
<META HTTP-EQUIV="keywords" CONTENT="search words">
<META HTTP-EQUIV="Expires" CONTENT="0">
<script SRC="include/datepicker.js" LANGUAGE="JavaScript" TYPE="text/javascript"></script>
<script SRC="include/jsfunctions.js" LANGUAGE="JavaScript" TYPE="text/javascript"></script>
<link REL="stylesheet" TYPE="text/css" HREF="css/datepicker.css">
<script language="javascript" type="text/javascript">
function limitText(limitField, limitCount, limitNum) {
    if (limitField.value.length > limitNum) {
        limitField.value = limitField.value.substring(0, limitNum);
    } else {
        limitCount.value = limitNum - limitField.value.length;
    }
}
</script>
{"List":[{"ID":"175114","Number":"28992"]}

任务是将JSON部分反序列化为某个对象。字符串可以以一些文本开头,但它肯定包含有效的JSON。我尝试过使用JSON验证REGEX,但是在。net中解析这种模式有一个问题。
所以最后我只想得到:

{
    "List": [{
        "ID": "175114",
        "Number": "28992"
    }]
}

澄清1:
在整个混乱的字符串中只有单个 JSON对象,但文本可以包含{}(实际上是HTML,可以包含带有<script> function(){.....的javascript)

从.net中的字符串中提取JSON

您可以使用这个方法

    public object ExtractJsonObject(string mixedString)
    {
        for (var i = mixedString.IndexOf('{'); i > -1; i = mixedString.IndexOf('{', i + 1))
        {
            for (var j = mixedString.LastIndexOf('}'); j > -1; j = mixedString.LastIndexOf("}", j -1))
            {
                var jsonProbe = mixedString.Substring(i, j - i + 1);
                try
                {
                    return JsonConvert.DeserializeObject(jsonProbe);
                }
                catch
                {                        
                }
            }
        }
        return null;
    }

关键思想是搜索所有{和}对并探测它们,如果它们包含有效的JSON。第一个有效的JSON事件被转换为对象并返回。

使用正则表达式查找所有可能的JSON结构:

'{(.|'s)*'}

Regex例子

然后迭代所有这些匹配,直到找到一个不会导致异常的匹配:

JsonConvert.SerializeObject(match);

如果您知道JSON结构的格式,请使用JsonSchema