Ich habe eine rohe Schnur. Ich möchte nur überprüfen, ob die Zeichenfolge JSON gültig ist oder nicht. Ich benutze JSON.NET.
Durch Code:
Am besten verwenden Sie parse in a try-catch
und fangen bei fehlgeschlagener Analyse eine Ausnahme ab. (Mir ist keine TryParse
Methode bekannt) .
(Verwenden von JSON.Net)
Einfachste Weg , um würde Parse
die Zeichenfolge mit JToken.Parse
, und auch zu überprüfen , ob die Zeichenfolge beginnt mit {
oder [
und endet mit }
oder ]
jeweils (von dieser aufgenommener Antwort ) :
private static bool IsValidJson(string strInput)
{
if (string.IsNullOrWhiteSpace(stringValue)) { return false;}
strInput = strInput.Trim();
if ((strInput.StartsWith("{") && strInput.EndsWith("}")) || //For object
(strInput.StartsWith("[") && strInput.EndsWith("]"))) //For array
{
try
{
var obj = JToken.Parse(strInput);
return true;
}
catch (JsonReaderException jex)
{
//Exception in parsing json
Console.WriteLine(jex.Message);
return false;
}
catch (Exception ex) //some other exception
{
Console.WriteLine(ex.ToString());
return false;
}
}
else
{
return false;
}
}
Der Grund für das Hinzufügen von Überprüfungen für {
oder [
usw. beruhte auf der Tatsache, dass JToken.Parse
die Werte wie "1234"
oder "'a string'"
als gültiges Token analysiert wurden . Die andere Möglichkeit könnte darin bestehen, beide JObject.Parse
und das JArray.Parse
Parsen zu verwenden und zu prüfen, ob einer von ihnen erfolgreich ist, aber ich glaube, dass es einfacher ist , dies zu überprüfen {}
und []
sollte es auch sein. (Danke @RhinoDevel für den Hinweis )
Ohne JSON.Net
Sie können den .NET Framework 4.5 System.Json-Namespace wie folgt verwenden :
string jsonString = "someString";
try
{
var tmpObj = JsonValue.Parse(jsonString);
}
catch (FormatException fex)
{
//Invalid json format
Console.WriteLine(fex);
}
catch (Exception ex) //some other exception
{
Console.WriteLine(ex.ToString());
}
(Sie müssen jedoch System.Json
über den Nuget-Paketmanager mit dem folgenden Befehl installieren : PM> Install-Package System.Json -Version 4.0.20126.16343
on Package Manager Console) (von hier übernommen )
Non-Code-Weg:
Wenn es eine kleine JSON-Zeichenfolge gibt und Sie versuchen, einen Fehler in der JSON-Zeichenfolge zu finden, bevorzuge ich persönlich die Verwendung verfügbarer Online-Tools. Was ich normalerweise mache ist:
JToken.Parse("1234")
! Es könnte eine gute Idee sein, zuerst zu überprüfen, ob die Zeichenfolge mit[
oder beginnt{
. Eine andere Alternative ist VerwendungJObject.Parse()
undJArray.Parse()
.JToken.Parse("{a:1}")
löst keine Ausnahme aus, obwohl dies ungültig ist JSON -a
sollte zitiert werden ( stackoverflow.com/q/949449/3116322 )Verwenden Sie die
JContainer.Parse(str)
Methode, um zu überprüfen, ob der str ein gültiger Json ist. Wenn dies eine Ausnahme auslöst, handelt es sich nicht um einen gültigen Json.JObject.Parse
- Kann verwendet werden, um zu überprüfen, ob die Zeichenfolge ein gültiges Json-Objekt ist.JArray.Parse
- Kann verwendet werden, um zu überprüfen, ob die Zeichenfolge ein gültiges Json-Array ist.JContainer.Parse
- Kann verwendet werden, um sowohl nach Json-Objekt als auch nach Array zu suchenquelle
JContainer.Parse("1234");
.Aufbauend auf Habibs Antwort könnten Sie eine Erweiterungsmethode schreiben:
Welches kann dann so verwendet werden:
quelle
JToken.Parse(s);
kehrt zurück,true
auch wennJToken.Parse(123);
true
für diesen ungültigenJSON
:{A:{"B": 1}}
Um der Antwort von @ Habib etwas hinzuzufügen, können Sie auch überprüfen, ob JSON von einem gültigen Typ stammt:
quelle
Ich habe festgestellt, dass JToken.Parse ungültiges JSON wie das folgende falsch analysiert:
Fügen Sie die JSON-Zeichenfolge in http://jsonlint.com/ ein - sie ist ungültig.
Also benutze ich:
quelle
{ name : "l am invalid JSON" }
⚠️ Alternative Option ohne JSON.Net ⚠️
Für .Net Core / .Net 5 ( in der Vorschau zum jetzigen Zeitpunkt ) kann man auch den
System.Text.Json
Namespace verwenden und mit dem analysierenJsonDocument
. Beispiel ist eine Erweiterungsmethode, die auf den Namespace-Operationen basiert:quelle
In Bezug auf die Antwort von Tom Beech; Ich habe mir stattdessen Folgendes ausgedacht:
Mit einer Verwendung der folgenden:
quelle
string
, aber diese Antwort sollte wirklich entweder a) nicht hier sein oder b) sagen "Ich habe die Antwort von Tom Beech verwendet " ohne diethis
, dh ohne es zu einem Erweiterungsmitglied zu machen) - sowohl diese Antwort als auch die referenzierte haben identische Kürze und Schwächen. Wenn Sie darauf hinweisen müssen, kommentieren Sie einfach die andere Antwort.JToken.Type
ist nach erfolgreicher Analyse verfügbar. Dies kann verwendet werden, um einen Teil der Präambel in den obigen Antworten zu entfernen und Einblicke für eine genauere Kontrolle des Ergebnisses zu erhalten. Völlig ungültige Eingabe (z. B."{----}".IsValidJson();
wird immer noch eine Ausnahme ausgelöst ).Json.Net-Referenz für
JToken.Type
: https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_Linq_JTokenType.htmquelle
Diese Methode erfordert keine externen Bibliotheken
quelle
Hier ist eine TryParse-Erweiterungsmethode, die auf Habibs Antwort basiert:
Verwendung:
quelle
Ich benutze dieses:
quelle