【问题标题】:Extract JSON from string in .NET从.NET中的字符串中提取JSON
【发布时间】:2017-03-14 16:06:24
【问题描述】:

输入字符串是一些带有有效 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 validation REGEX,但在 .NET 中解析此类模式时出现问题。
所以最后我只想得到:

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

说明 1:
整个凌乱的字符串中只有 单个 JSON 对象,但文本可以包含 {}(它实际上是 HTML,可以包含带有 &lt;script&gt; function(){..... 的 javascripts)

【问题讨论】:

  • 嗯...你可以使用 Json.NET
  • @AndyKorneyev 我试过了,但它无法正确反序列化字符串。所以我必须以某种方式告诉 JSON.NET 如何解析它。
  • 为什么JSON部分前后的文字存在?文本可以包含{} 吗?如果不是,那么简单的解决方案是找到第一个和最后一个括号,并假设这是 JSON 的开始和结束。否则我会说你搞砸了,因为你无法判断实际 JSON 从哪里开始。
  • 也许该文本有一些限制?例如,是否可以包含“{”字符?
  • 你搞砸了,因为即使{} 也是有效的 json,而且你的 html 包含的文本中包含的内容可能是脱离上下文的实际 json。但是,如果您知道它的放置位置,您可以尝试使用 DOM 解析器从 HTML 中提取您的 JSON。如果你的 JSON 是用 HTML 格式化的,你可能会更糟:X

标签: c# .net json regex extract


【解决方案1】:

你可以用这个方法

    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 匹配项将转换为对象并返回。

【讨论】:

  • 我打算通过手动查找'{'的出现然后匹配一些属性来做几乎这样的事情。接受的答案对我来说似乎更合适。也感谢您的时间和帮助!
  • @0x49D1 - 欢迎您。只是一个额外的想法:从最长的匹配到最短的匹配可能会更好(我不确定,如果在正则表达式匹配中有定义的顺序)。如果没有固定的顺序,那么 JSON 的一个子部分也可能被识别为有效的 JSON。
【解决方案2】:

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

\{(.|\s)*\}

Regex example

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

JsonConvert.SerializeObject(match);

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

【讨论】:

  • 谢谢!几乎没有细化,这比使用子字符串的魔法更好!
  • 这个正则表达式可能很危险,因为它可能会造成灾难性的回溯。
猜你喜欢
  • 2014-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
  • 2021-01-01
相关资源
最近更新 更多