在 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-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]
【讨论】:
【参考方案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# 中具有开始和结束标记