在C#中快速检查字符串是XML还是JSON的方法

时间:2011-08-31 11:14:48

标签: c# xml json json.net

我在控制台应用程序中使用C#,我需要一种快速方法来检查从另一个服务返回的字符串是XML还是JSON。

我知道如果它只是XML,我可以根据模式检查它,或者如果它只是JSON我可以尝试用JSON.Net解析它,但有更快的方法 - 也许使用内置.Net函数 - 只是告诉它是什么然后继续处理它?<​​/ p>

5 个答案:

答案 0 :(得分:51)

很简单:

  1. 有效的JSON始终以'{'或'['
  2. 开头
  3. 有效的XML始终以'&lt;'
  4. 开头

    我在谈论非空间数据。

答案 1 :(得分:32)

public static bool IsJson(this string input){
    input = input.Trim();
    return input.StartsWith("{") && input.EndsWith("}") 
           || input.StartsWith("[") && input.EndsWith("]");
}

它有点脏但简单快捷

基本上可以测试第一个角色。测试最后一个是测试良好形成的一种非常粗鲁的方法。它并不能保证它只是增加了它形成良好的可能性。

如果你想要一个更强大的版本,你可以利用if的短路来仅评估良好形成,如果初步检查是好的。以下代码依赖于JSON.net

public static bool IsJson(this string input){
    input = input.Trim();
    Predicate IsWellFormed = () => {
             try {
                JToken.Parse(input);
             } catch {
                return false;
             }
             return true;
    }
    return (input.StartsWith("{") && input.EndsWith("}") 
            || input.StartsWith("[") && input.EndsWith("]"))
           && IsWellFormed()
}

答案 2 :(得分:2)

以为我也会在这里抛出我的解决方案......

if (jsonData.Trim().Substring(0, 1).IndexOfAny(new[] {'[', '{'}) != 0)
     throw new Exception("The source file must be in JSON format");

或延期......

public static bool IsJson(this string jsonData)
{
     return jsonData.Trim().Substring(0, 1).IndexOfAny(new[] { '[', '{' }) == 0;
}

用法:

if (!jsonData.IsJson())
     throw new Exception("The source file must be in JSON format");

答案 3 :(得分:0)

答案很好,但我想你们都忘记了Json的结局。我在这里有一个很好的例子,你的方法不会被捕获,当解析器试图解析Json时它会通过和异常。

{&#34;职位&#34;:[{&#34;对象&#34;:&#34;职位&#34;,&#34; powerState&#34;:&#34; 1& #34;&#34;时间&#34;:&#34; 72796&#34;&#34;地方&#34;:&#34; 1&#34;&#34;的clientId&#34;:& #34;&#34; ]}

正如你所看到的,以{和以}结尾,在第二只手以[并以...结尾]开头,但有人忘了关闭第3位{。它在Json Parser中生成并出错。

我会说最好检查{[我们发现的]的开头和结尾。这种方法会更安全。

通常这不常见,但有些人仍然手工制作自己的Json而忘记了一些部分......不要相信外部数据!

我希望它有所帮助。

答案 4 :(得分:0)

检查返回的HttpContentHeaders.ContentType-HttpContentHeaders.ContentType Property中的HttpResponseMessage属性。您会看到类似application/json; charset=utf-8text/json; charset=utf-8text/xml; charset=utf-8的内容。它返回一个您可以检查的MediaTypeHeaderValue实例。对于您的情况,您将查看MediaTypeHeaderValue.SubType Property,这是我用来确保我进行相应解析和验证的地方。

这是最安全,最准确的方法。当然,除非您有一个将XML或json作为字符串返回的API。

如果您只是将Content-Type值用作字符串,则可以使用  MediaTypeHeaderValue.Parse(String)来帮助解析Content-Type字符串。

Content-Type属性被定义为HTTP规范的一部分,详细信息在这里:Content-Type [MDN]