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

C# 在C中快速检查字符串是XML还是JSON的方法#,c#,xml,json,json.net,C#,Xml,Json,Json.net,我在一个控制台应用程序中使用C#,我需要一种快速方法来检查从另一个服务返回的字符串是XML还是JSON 我知道如果它只是XML,我可以对照模式检查它,或者如果它只是JSON,我可以尝试用JSON.Net解析它,但是有没有一种更快的方法——可能使用内置的.Net函数——在继续处理它之前告诉它是哪个?非常简单: 有效的JSON总是以“{”或“[”开头 有效的XML总是以' 有点脏,但简单又快 基本上,测试第一个字符就足够了。测试最后一个字符是测试良好格式的一种非常粗鲁的方式。这并不能保证它的正确性,

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

我知道如果它只是XML,我可以对照模式检查它,或者如果它只是JSON,我可以尝试用JSON.Net解析它,但是有没有一种更快的方法——可能使用内置的.Net函数——在继续处理它之前告诉它是哪个?

非常简单:

  • 有效的JSON总是以“{”或“[”开头
  • 有效的XML总是以' 有点脏,但简单又快

    基本上,测试第一个字符就足够了。测试最后一个字符是测试良好格式的一种非常粗鲁的方式。这并不能保证它的正确性,它只是增加了它良好格式的可能性

    如果您想要一个更健壮的版本,您可以利用If的短路,仅在初始检查良好的情况下评估良好的格式

    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()
    }
    

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

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

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

    {
        "positions": 
        [
            {
                "object": "position",
                "powerState": "1",
                "time": "72796",
                "place": "1",
                "clientId": ""
        ]
    }
    
    如您所见,它以
    {
    开始,以
    }
    结束,第二个以
    [
    开始,以
    ]
    结束,但有人忘记关闭第三个
    {
    。这会在JSON解析器中产生错误

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

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


    我希望它能有所帮助。

    检查返回的
    HttpResponseMessage的
    HttpContentHeaders.ContentType
    属性中的内容。您将看到类似
    application/json;charset=utf-8
    text/xml;charset=utf-8
    。它返回一个
    mediateheaderv
    实例值e您可以检查。在您的案例中,您可以查看以下内容:这是我用来确保相应解析和验证的内容

    这是最安全、最准确的方法。当然,除非您有一个API以字符串形式返回xml或json

    如果将
    内容类型
    值作为字符串,则可以使用 帮助分析
    内容类型
    字符串


    内容类型
    属性被定义为HTTP规范的一部分,详细信息如下:

    如果两者都不是,您是否关心错误处理?否返回数据的服务将始终返回其中一个或另一个。对于JSON,请参阅@finoutlook-查看规范。对于JSON,明确说明有效的JSON从一个o开始对于这两个字符和XML,您可以阅读正式的语法规范。您将看到,如果您从服务器获取字符串,并且可能是JSON或其他内容,那么它必须以
    开头,这是不完全有效的。如果它发回另一个用{}包装的字符串呢或者?我不明白为什么这被标记为正确答案,所有这些只是确认字符串可以是JSON或XML。但是字符串{{{{{{{{{{{{{}有效的JSON吗?不…@JLo,因为这个问题与XML或JSON的验证无关,而是以最快的方式区分两者。我非常确定“null”这个词唯一有效的JSON。这可能是唯一的例外。我使用了类似的方法,但只检查字符串的开头-因此只需
    TrimStart()
    StartsWith()
    而不是
    .Trim().Substring(0,1)
    您只需执行
    .Trim()[0]
    永远不要抛出异常…抛出框架派生的异常类型或您自己的自定义派生异常。当然,但OP只是询问一种快速方法来确定它是XML还是JSON,而不是它是有效的XML还是JSON。stringOP表示,他想在处理它之前对它进行测试。在处理之前,您无法确定它是否有效信息技术
    {
        "positions": 
        [
            {
                "object": "position",
                "powerState": "1",
                "time": "72796",
                "place": "1",
                "clientId": ""
        ]
    }