web-dev-qa-db-ja.com

C#で文字列がXMLかJSONかをすばやく確認する方法

コンソールアプリでC#を使用していますが、別のサービスから返される文字列がXMLかJSONかをすばやく確認する方法が必要です。

それが単なるXMLであるか、スキーマと照合できるか、JSONだけである場合はJSON.Netで解析することができますが、より迅速な方法があります-。それを処理する前にそれが何であるかを教えてください?

38
finoutlook

非常に簡単:

  1. 有効なJSONは常に「{」または「[」で始まります
  2. 有効なXMLは常に「<」で始まります

私は非空間データについて話している。

54
Artyom
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()
}
33
Rune FS

私もここに私の解決策を投げると思いました...

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");
2
Sam Jones

返されたHttpResponseMessageHttpContentHeaders.ContentTypeプロパティを確認します- HttpContentHeaders.ContentType Propertyapplication/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]

0
Dave Black

答えはいいですが、Jsonの終わりを忘れていると思います。ここに、あなたのメソッドがキャッチせず、パーサーがJsonを解析しようとすると例外を通過するという良い例があります。

{"positions":[{"object": "position"、 "powerState": "1"、 "time": "72796"、 "place": "1"、 "clientId": ""] }

ご覧のとおり、{で始まり}で終わり、秒針では[で始まり、]で終わりますが、誰かが3番目の{を閉じるのを忘れました。 Json Parserでエラーを生成します。

私は、{[を見つけることの始まりと終わりをチェックする方が良いと言います。この方法はより安全です。

通常、それは普通ではありませんが、一部の人々はまだ自分のJsonを手作りし、一部を忘れています...外部データを信頼しないでください!

役に立てば幸いです。

0
ManuVR