web-dev-qa-db-fra.com

Manière de vérifier rapidement si la chaîne est XML ou JSON en C #

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?

34
finoutlook

Très simple:

  1. JSON valide commence toujours par '{' ou '['
  2. XML valide commence toujours par '<'

Je parle de données non spatiales.

49
Artyom
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()
}
31
Rune FS

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

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.

0
ManuVR