it-swarm.com.de

So können Sie schnell überprüfen, ob String in C # XML oder JSON ist.

Ich verwende C # in einer Konsolen-App und brauche eine schnelle Möglichkeit, um zu überprüfen, ob eine Zeichenfolge, die von einem anderen Dienst zurückgegeben wird, XML oder JSON ist.

Ich weiß, wenn es nur XML ist, könnte ich es mit einem Schema vergleichen, oder wenn es nur JSON ist, könnte ich versuchen, es mit JSON.Net zu analysieren, aber es gibt einen schnelleren Weg - vielleicht mithilfe von eingebauten .Net-Funktionen - einfach zu sagen, was es ist, bevor es weiter verarbeitet wird?

34
finoutlook

Sehr einfach:

  1. Gültiges JSON beginnt immer mit '{' oder '['
  2. Gültiges XML beginnt immer mit '<'

Ich spreche von Nicht-Weltraumdaten.

49
Artyom
public static bool IsJson(this string input){
    input = input.Trim();
    return input.StartsWith("{") && input.EndsWith("}") 
           || input.StartsWith("[") && input.EndsWith("]");
}

es ist ein bisschen schmutzig, aber einfach und schnell

Es reicht im Wesentlichen, das erste Zeichen zu testen. Die Prüfung der Leisten ist eine sehr unhöfliche Art, die Formung zu testen. Es garantiert nicht, dass es einfach die Chance erhöht, dass es gut ausgebildet ist.

Wenn Sie eine robustere Version wünschen, können Sie den Kurzschluss von if nutzen, um nur dann die Formung zu bewerten, wenn die anfängliche Prüfung gut ist. Der folgende Code basiert auf 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()
}
31
Rune FS

Ich dachte, ich würde meine Lösung auch hier werfen ...

if (jsonData.Trim().Substring(0, 1).IndexOfAny(new[] {'[', '{'}) != 0)
     throw new Exception("The source file must be in JSON format");

oder eine Erweiterung ...

public static bool IsJson(this string jsonData)
{
     return jsonData.Trim().Substring(0, 1).IndexOfAny(new[] { '[', '{' }) == 0;
}

verwendungszweck:

if (!jsonData.IsJson())
     throw new Exception("The source file must be in JSON format");
2
Sam Jones

Überprüfen Sie die Eigenschaft HttpContentHeaders.ContentType In der zurückgegebenen Eigenschaft HttpResponseMessage - HttpContentHeaders.ContentType . Sie sehen so etwas wie application/json; charset=utf-8, text/json; charset=utf-8, text/xml; charset=utf-8. Es gibt eine MediaTypeHeaderValue -Instanz zurück, die Sie untersuchen können. In Ihrem Fall würden Sie sich die MediaTypeHeaderValue.SubType-Eigenschaft ansehen. Dies ist das, was ich verwende, um sicherzustellen, dass ich entsprechend analysiere und validiere.

Dies ist der sicherste und genaueste Weg. Es sei denn, Sie haben eine API, die XML oder JSON als Zeichenfolge zurückgibt.

Wenn Sie nur den Wert Content-Type Als Zeichenfolge hatten, können Sie MediaTypeHeaderValue.Parse (String) verwenden, um die Zeichenfolge Content-Type Zu analysieren.

Die Eigenschaft Content-Type Wird als Teil der HTTP-Spezifikation definiert. Einzelheiten hierzu finden Sie hier: Content-Type [MDN]

0
Dave Black

Die Antworten sind nett, aber ich denke, Sie vergessen das Ende des Json. Ich habe hier ein gutes Beispiel, das Ihre Methoden nicht einfangen würden, und es wird eine Ausnahme geben, wenn der Parser versuchen würde, den Json zu analysieren.

{"positionen": [{"object": "position", "powerState": "1", "time": "72796", "place": "1", "clientId": ""]}

Wie Sie sehen, beginnt mit {und endet mit}, in der zweiten Hand beginnt mit [und endet mit], aber jemand hat vergessen, die 3 zu schließen. Es erzeugt einen Fehler im Json Parser.

Ich würde sagen, dass es besser ist, den Anfang und das Ende auf [zu überprüfen, was wir finden. Diese Methode wird sicherer.

Normalerweise ist das nicht üblich, aber einige Leute fertigen immer noch ihren eigenen Json und vergessen einige Teile ... Vertrauen Sie nicht auf externe Daten!

Ich hoffe, es hilft.

0
ManuVR