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

Posted

技术标签:

【中文标题】在 C# 中快速检查字符串是 XML 还是 JSON 的方法【英文标题】:Way to quickly check if string is XML or JSON in C# 【发布时间】:2011-11-07 12:58:52 【问题描述】:

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

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

【问题讨论】:

如果两者都不是,您是否关心错误处理? 没有返回数据的服务总是返回一个或另一个。 对于 JSON,请参阅 How to make sure that string is Valid JSON using JSON.NET 【参考方案1】:

很简单:

    有效的 JSON 总是以 '' 或 '[' 开头 有效的 XML 总是以 ' 开头

我说的是非空间数据。

【讨论】:

@finoutlook - 看看规格。对于 JSON,明确指出有效的 JSON 以这两个字符之一开头,对于 XML,您可以阅读正式的语法规范。你会看到它必须以<... 开头 如果您从服务器获取字符串并且它可能是 JSON 或者它可能是其他东西,这并不完全有效。如果它发回另一个用 或 包裹的字符串怎么办? 我不明白为什么这被标记为正确答案,所有这一切都是为了确认字符串可以是 JSON 或 XML。但是字符串 是有效的 JSON 吗?不... @JLo 因为该问题与 XML 或 JSON 的验证无关,而是以最快的方式区分两者。 我很确定“null”这个词本身就是有效的 JSON。这可能是唯一的例外。【参考方案2】:
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()

【讨论】:

我使用了类似的东西,但只检查字符串的开头 - 所以只检查 TrimStart()StartsWith()【参考方案3】:

我想我也会把我的解决方案放在这里......

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");

【讨论】:

你可以简单地使用.Trim().Substring(0,1) 而不是.Trim()[0] 永不抛出异常...抛出框架派生的异常类型或您自己的自定义派生异常。【参考方案4】:

检查返回的HttpResponseMessage - HttpContentHeaders.ContentType Property 中的HttpContentHeaders.ContentType 属性。您会看到类似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]

【讨论】:

【参考方案5】:

答案很好,但我想你们都忘记了 JSON 的结尾。这是一个很好的示例,您的方法无法捕获,当解析器尝试解析 JSON 时,它会抛出异常。


    "positions": 
    [
        
            "object": "position",
            "powerState": "1",
            "time": "72796",
            "place": "1",
            "clientId": ""
    ]

如您所见,它以 开头并以 结尾,在二手以[ 开头并以] 结尾,但是有人忘记关闭第三个。这会在 JSON 解析器中生成错误。

我想说一种更安全的方法是检查我们找到的[ 的开头和结尾。

这种情况并不经常发生,但有些人仍然手工制作自己的 JSON 并忘记了某些部分......不要相信外部数据!

希望对你有帮助。

【讨论】:

当然,但 OP 只是询问一种快速方法来确定它是 XML 还是 JSON,而不是有效的 XML 或 JSON 字符串 OP 表示他想要一种在处理之前对其进行测试的方法。在你处理它之前,如果它是有效的,你就不能拒绝

以上是关于在 C# 中快速检查字符串是 XML 还是 JSON 的方法的主要内容,如果未能解决你的问题,请参考以下文章

Java 检查字符串是有效的 JSON 还是有效的 XML,或者两者都不是

匹配 XML 字符串的正则表达式在 C# 中具有开始和结束标记

在 C# 中浏览 XML 文件的最快方法是啥?

在 C# 中转义无效的 XML 字符

如何在 C# 中检查给定的 URL 是 HTTP 还是 HTTPS

C# XML 怎么判断 叶子节点。