J'utilise C # dans une application console et j'ai besoin d'un moyen rapide de vérifier si une chaîne renvoyée par un autre service est XML ou JSON.
Je sais que s’il s’agissait uniquement de XML, je pourrais le comparer à un schéma, ou s’il s’agissait de JSON, je pourrais aussi l’analyser avec JSON.Net, mais existe-t-il un moyen plus rapide - peut-être d’utiliser des fonctions .Net intégrées - juste dire ce qu'il est avant de continuer à le traiter?
Très simple:
Je parle de données non spatiales.
public static bool IsJson(this string input){
input = input.Trim();
return input.StartsWith("{") && input.EndsWith("}")
|| input.StartsWith("[") && input.EndsWith("]");
}
c'est un peu sale mais simple et rapide
Il suffit essentiellement de tester le premier caractère. Tester le dernier est un moyen très grossier de tester la bonne forme. Cela ne garantit pas que cela augmente simplement les chances qu'il soit bien formé.
Si vous voulez une version plus robuste, vous pouvez tirer parti du court-circuit de if pour évaluer uniquement la qualité de la mise en forme si la vérification initiale est bonne. Le code ci-dessous repose sur 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()
}
Je pensais que jetterais ma solution ici aussi ...
if (jsonData.Trim().Substring(0, 1).IndexOfAny(new[] {'[', '{'}) != 0)
throw new Exception("The source file must be in JSON format");
ou une extension ...
public static bool IsJson(this string jsonData)
{
return jsonData.Trim().Substring(0, 1).IndexOfAny(new[] { '[', '{' }) == 0;
}
usage:
if (!jsonData.IsJson())
throw new Exception("The source file must be in JSON format");
Les réponses sont bonnes mais je pense que vous oubliez tous la fin du Json. J'ai ici un bon exemple que vos méthodes n'accepteraient pas et qui passeraient à côté d'une exception lorsque l'analyseur tenterait d'analyser le Json.
{"positions": [{"objet": "position", "powerState": "1", "heure": "72796", "lieu": "1", "clientId": ""]}
Comme vous pouvez le constater, commence par {et se termine par}, la seconde commence par [et se termine par] mais quelqu'un a oublié de fermer la 3ème {. Il génère et erreur dans le Json Parser.
Je dirais qu'il est préférable de vérifier le début et la fin pour {[que nous trouvons. Cette méthode sera plus sécurisée.
Normalement, cela n’est pas habituel, mais certaines personnes fabriquent encore leur propre Json et en oublient certaines parties ... Ne faites pas confiance aux données externes!
J'espère que ça aide.