45 Stimmen

Schnelles Überprüfen, ob ein String XML oder JSON in C# ist

Ich bin mit C# in einer Konsole app und ich brauche eine schnelle Möglichkeit zu überprüfen, ob eine Zeichenfolge von einem anderen Dienst zurückgegeben wird, ist XML oder JSON.

Ich weiß, wenn es nur XML war, ich könnte es gegen ein Schema überprüfen, oder wenn es nur JSON war ich könnte versuchen, es mit JSON.Net zu analysieren, aber gibt es einen schnelleren Weg - vielleicht mit Build in .Net-Funktionen - nur zu sagen, welche es ist, bevor Sie dann auf, es zu verarbeiten?

0 Stimmen

Kümmern Sie sich um die Fehlerbehandlung, wenn es keine ist?

0 Stimmen

Nein, der Dienst, der die Daten zurückgibt, wird immer das eine oder das andere zurückgeben.

0 Stimmen

66voto

Artyom Punkte 29856

Ganz einfach:

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

Ich spreche von Nicht-Raumfahrtdaten.

0 Stimmen

Hört sich gut an, es sei denn, jemand kann auf irgendwelche Ausnahmen hinweisen?

1 Stimmen

@finoutlook - sehen Sie sich einfach die Spezifikationen an. Für JSON ist ausdrücklich festgelegt, dass gültiges JSON mit einem dieser beiden Zeichen beginnt und für XML können Sie die formalen Grammatikspezifikationen lesen. Sie werden sehen, dass es mit folgenden Zeichen beginnen muss < ...

0 Stimmen

Ja, ich muss darauf vertrauen, dass es sich um eine gültige Antwort des Servers handelt, und du hast Recht, dass sie genau den Spezifikationen entsprechen sollte.

36voto

Rune FS Punkte 20934
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

Im Grunde reicht es aus, das erste Zeichen zu prüfen. Die Prüfung des letzten Zeichens ist eine sehr grobe Art der Prüfung der Wohlgeformtheit. Sie garantiert es nicht, sondern erhöht nur die Wahrscheinlichkeit, dass es gut geformt ist.

Wenn Sie eine robustere Version wünschen, könnten Sie die Vorteile des Kurzschlusses von if's nutzen, um die Wohlgeformtheit nur dann 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()
}

1 Stimmen

Ich habe etwas Ähnliches gemacht, aber nur den Anfang der Zeichenkette überprüft - also nur TrimStart() y StartsWith()

2voto

Sam Jones Punkte 4179

Ich dachte, ich werfe meine Lösung auch hier rein...

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

oder eine Verlängerung...

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

Verwendung:

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

1 Stimmen

Anstelle von .Trim().Substring(0,1) könnten Sie einfach tun .Trim()[0]

1 Stimmen

Werfen Sie niemals Exception... werfen Sie einen vom Framework abgeleiteten Ausnahmetyp oder Ihre eigene abgeleitete Ausnahme.

0voto

ManuVR Punkte 46

Die Antworten sind nett, aber ich glaube, Sie alle vergessen das Ende des JSON. Hier ist ein gutes Beispiel, dass Ihre Methoden nicht fangen würde, und es wird eine Ausnahme auslösen, wenn der Parser versucht, die JSON zu parsen.

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

Wie Sie sehen können, beginnt sie mit { und endet mit } , in der zweiten Hand beginnt mit [ und endet mit ] aber jemand hat vergessen, die 3. { . Dies erzeugt einen Fehler im JSON-Parser.

Ich würde sagen, eine sicherere Methode ist es, den Anfang und das Ende auf {[ die wir finden.

Das passiert nicht oft, aber manche Leute basteln immer noch ihr eigenes JSON und vergessen einige Teile... Trauen Sie externen Daten nicht!

Ich hoffe, es hilft.

6 Stimmen

Sicher, aber der OP fragt nur nach einem schnellen Weg, um zu entscheiden, ob es XML oder JSON ist, nicht ob es eine gültige XML- oder JSON-Zeichenfolge ist

0 Stimmen

Der Auftraggeber gibt an, dass er eine Möglichkeit sucht, die Daten vor der Verarbeitung zu testen. Sie können nicht wissen, ob es gültig ist, bis Sie es verarbeitet haben

0voto

Dave Black Punkte 6469

Prüfen Sie die HttpContentHeaders.ContentType Eigenschaft in des zurückgegebenen HttpResponseMessage - HttpContentHeaders.ContentType-Eigenschaft . Sie werden etwas sehen wie application/json; charset=utf-8 , text/json; charset=utf-8 , text/xml; charset=utf-8 . Sie gibt eine MediaTypeHeaderValue Instanz, die Sie untersuchen können. In Ihrem Fall würden Sie sich die MediaTypeHeaderValue.SubType-Eigenschaft Dies verwende ich, um sicherzustellen, dass ich entsprechend parse und validiere.

Dies ist der sicherste und genaueste Weg. Es sei denn natürlich, Sie haben eine API, die xml oder json als String zurückgibt.

Hätten Sie nur die Content-Type Wert als Zeichenkette zu verwenden, könnten Sie MediaTypeHeaderValue.Parse(String) um die Analyse der Content-Type String.

En Content-Type Eigenschaft ist als Teil der HTTP-Spezifikation definiert; Einzelheiten finden Sie hier: Inhalt-Typ [MDN]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X