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