c# Expression régulière pour analyser un tableau d'objets JSON?




.net regex (4)

public Dictionary<string, string> ParseJSON(string s)
{
    Regex r = new Regex("\"(?<Key>[\\w]*)\":\"?(?<Value>([\\s\\w\\d\\.\\\\\\-/:_\\+]+(,[,\\s\\w\\d\\.\\\\\\-/:_\\+]*)?)*)\"?");
    MatchCollection mc = r.Matches(s);

    Dictionary<string, string> json = new Dictionary<string, string>();

    foreach (Match k in mc)
    {
        json.Add(k.Groups["Key"].Value, k.Groups["Value"].Value);

    }
    return json;
}

Cette fonction implémente l'expression régulière Lukasz. Je ne fais qu'ajouter à inclure + char au groupe de valeur (parce que j'utilise cela pour analyser live connect authen token)

J'essaye d'analyser un tableau d'objets JSON dans un tableau de chaînes en C #. Je peux extraire le tableau de l'objet JSON, mais je ne peux pas diviser la chaîne de tableau en un tableau d'objets individuels.

Ce que j'ai est cette chaîne de test:

string json = "{items:[{id:0,name:\"Lorem Ipsum\"},{id:1,name" 
            + ":\"Lorem Ipsum\"},{id:2,name:\"Lorem Ipsum\"}]}";

À l'heure actuelle, j'utilise les expressions régulières suivantes pour diviser les éléments en objets individuels. Pour l'instant, ils sont deux expressions régulières séparées jusqu'à ce que je répare le problème avec le second:

Regex arrayFinder = new Regex(@"\{items:\[(?<items>[^\]]*)\]\}"
                                 , RegexOptions.ExplicitCapture);
Regex arrayParser = new Regex(@"((?<items>\{[^\}]\}),?)+"
                                 , RegexOptions.ExplicitCapture);

L' arrayFinder regex de arrayFinder fonctionne comme je l'attendais mais, pour des raisons que je ne comprends pas, l' arrayParser rationnelle arrayParser ne fonctionne pas du tout. Tout ce que je veux faire est de diviser les éléments individuels en leurs propres chaînes afin que j'obtienne une liste comme ceci:

{id:0,name:"Lorem Ipsum"}
{id:1,name:"Lorem Ipsum"}
{id:2,name:"Lorem Ipsum"}

Que cette liste soit un tableau string[] ou une collection Group ou Match n'a pas d'importance, mais je suis perplexe quant à la façon de diviser les objets. En utilisant le arrayParser et la chaîne json déclarée ci-dessus, j'ai essayé ce code que je supposais fonctionner sans chance:

string json = "{items:[{id:0,name:\"Lorem Ipsum\"},{id:1,name" 
            + ":\"Lorem Ipsum\"},{id:2,name:\"Lorem Ipsum\"}]}";

Regex arrayFinder = new Regex(@"\{items:\[(?<items>[^\]]*)\]\}"
                                 , RegexOptions.ExplicitCapture);
Regex arrayParser = new Regex(@"((?<items>\{[^\}]\}),?)+"
                                 , RegexOptions.ExplicitCapture);

string array = arrayFinder.Match(json).Groups["items"].Value;
// At this point the 'array' variable contains: 
// {id:0,name:"Lorem Ipsum"},{id:1,name:"Lorem Ipsum"},{id:2,name:"Lorem Ipsum"}

// I would have expected one of these 2 lines to return 
// the array of matches I'm looking for
CaptureCollection c = arrayParser.Match(array).Captures;
GroupCollection g = arrayParser.Match(array).Groups;

Quelqu'un peut-il voir ce que je fais mal? Je suis totalement coincé là-dessus.


Answer #1

JSON ne peut généralement pas être analysé avec des expressions régulières (certaines variantes extrêmement simplifiées de JSON peuvent, mais elles ne sont pas JSON mais quelque chose d'autre).

Vous avez besoin d'un analyseur réel pour analyser correctement JSON.

Et de toute façon, pourquoi essayez-vous d'analyser JSON? Il existe de nombreuses bibliothèques qui peuvent le faire pour vous, et bien mieux que votre code. Pourquoi réinventer la roue, quand il y a une usine de roues au coin de la rue avec les mots FOSS au-dessus de la porte?


Answer #2

Les parenthèses équilibrées sont littéralement un exemple de manuel d'un langage qui ne peut pas être traité avec des expressions régulières

bla bla bla ... regarde ça:

arrayParser = "(?<Key>[\w]+)":"?(?<Value>([\s\w\d\.\\\-/:_]+(,[,\s\w\d\.\\\-/:_]+)?)+)"?

Cela fonctionne pour moi

si vous voulez faire correspondre des valeurs vides, changez le dernier '+' en '*'


Answer #3

Utilisez-vous .NET 3.5? Si c'est le cas, vous pouvez utiliser DataContractJsonSerializer pour analyser cela. Il n'y a aucune raison de le faire vous-même.

Si vous n'utilisez pas .NET 3.5, vous pouvez utiliser Jayrock .





json