我在控制台应用程序中使用C#,我需要一种快速方法来检查从另一个服务返回的字符串是XML还是JSON。
我知道如果它只是XML,我可以根据模式检查它,或者如果它只是JSON我可以尝试用JSON.Net解析它,但有更快的方法 - 也许使用内置.Net函数 - 只是告诉它是什么然后继续处理它?</ p>
答案 0 :(得分:51)
很简单:
我在谈论非空间数据。
答案 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-8
,text/json; charset=utf-8
,text/xml; charset=utf-8
的内容。它返回一个您可以检查的MediaTypeHeaderValue
实例。对于您的情况,您将查看MediaTypeHeaderValue.SubType Property,这是我用来确保我进行相应解析和验证的地方。
这是最安全,最准确的方法。当然,除非您有一个将XML或json作为字符串返回的API。
如果您只是将Content-Type
值用作字符串,则可以使用
MediaTypeHeaderValue.Parse(String)来帮助解析Content-Type
字符串。
Content-Type
属性被定义为HTTP规范的一部分,详细信息在这里:Content-Type [MDN]