111 votes

L’analyse JSON à l’aide de Json.net

Je suis en train d'analyser certains JSON à l'aide de la JSon.Net de la bibliothèque. La documentation semble un peu clairsemée et je suis confus quant à la façon d'accomplir ce dont j'ai besoin. Ici, c'est le format JSON j'ai besoin d'analyser.

{
    "displayFieldName" : "OBJECT_NAME", 
    "fieldAliases" : {
        "OBJECT_NAME" : "OBJECT_NAME", 
        "OBJECT_TYPE" : "OBJECT_TYPE"
    }, 
    "positionType" : "point", 
    "reference" : {
        "id" : 1111
    }, 
    "objects" : [ {
        "attributes" : {
            "OBJECT_NAME" : "test name", 
            "OBJECT_TYPE" : "test type"
        }, 
        "position" : {
            "x" : 5, 
            "y" : 7
        }
    } ]
}

Les seules données que j'ai vraiment besoin de cela, c'est les trucs dans les objets du tableau. Est-il possible pour moi d'analyser les par qui, avec quelque chose comme le JSonTextReader et il suffit de tirer les choses que je veux, comme OBJECT_TYPE et de la position x et y? Je n'arrive pas à obtenir de l' JSonTextReader travailler à la manière dont je le veux et je le trouve peu ou pas d'exemples d'utilisation.

Il semble que la sérialisation d'abord, puis à l'aide de LINQ avec mon objet serait l'idéal et chaque exemple que je trouve traite de la sérialisation JSON en premier, mais je ne suis pas sûr de savoir comment je voudrais construire un objet de cette structure. En particulier les objets de tableau qui aurait besoin d'être quelque chose comme une liste de Paires d'attribut et de la position des objets. Je n'ai aucune idée de comment j'allais le code de mon objet JSon.Net serait de savoir comment sérialiser.

J'ai pensé que je pourrais écrire mon propre simple analyseur de tirer juste tout ce dont j'ai besoin dans un des attributs de l'objet que j'ai créé, mais je vais avoir peu de chance.

Espérons que tout cela fait sens, des idées?

129voto

Marc Gravell Points 482669

Je ne sais pas JSON.NET, mais il fonctionne très bien avec de (.NET 3.5 SP1) :

Edit :

Json.NET fonctionne en utilisant les mêmes classes et JSON.

Lien : la sérialisation et la désérialisation JSON avec Json.NET

10voto

jarrodn Points 99

Edit: Merci Marc, lire sur les struct vs question de classe et vous avez raison, merci!

J'ai tendance à utiliser la méthode suivante pour faire ce que vous décrivez, à l'aide d'une méthode statique de JSon.Net:

MyObject deserializedObject = JsonConvert.DeserializeObject<MyObject>(json);

Lien: la Sérialisation et la Désérialisation de JSON avec Json.NET

Pour les Objets de la liste, je suggère l'utilisation de génériques, listes fabriqués à partir de votre propre petite classe contenant attributes et position classe. Vous pouvez utiliser l' Point structure en System.Drawing (System.Drawing.Point ou System.Drawing.PointF pour les nombres à virgule flottante) pour vous X et Y.

Après la création de l'objet, c'est beaucoup plus facile d'obtenir les données que vous êtes après, contre le texte d'analyse, vous êtes le contraire de regarder.

2voto

Sam Grondahl Points 637
/*
     * This method takes in JSON in the form returned by javascript's
     * JSON.stringify(Object) and returns a string->string dictionary.
     * This method may be of use when the format of the json is unknown.
     * You can modify the delimiters, etc pretty easily in the source
     * (sorry I didn't abstract it--I have a very specific use).
     */ 
    public static Dictionary<string, string> jsonParse(string rawjson)
    {
        Dictionary<string, string> outdict = new Dictionary<string, string>();
        StringBuilder keybufferbuilder = new StringBuilder();
        StringBuilder valuebufferbuilder = new StringBuilder();
        StringReader bufferreader = new StringReader(rawjson);

        int s = 0;
        bool reading = false;
        bool inside_string = false;
        bool reading_value = false;
        //break at end (returns -1)
        while (s >= 0)
        {
            s = bufferreader.Read();
            //opening of json
            if (!reading)
            {
                if ((char)s == '{' && !inside_string && !reading) reading = true;
                continue;
            }
            else
            {
                //if we find a quote and we are not yet inside a string, advance and get inside
                if (!inside_string)
                {
                    //read past the quote
                    if ((char)s == '\"') inside_string = true;
                    continue;
                }
                if (inside_string)
                {
                    //if we reached the end of the string
                    if ((char)s == '\"')
                    {
                        inside_string = false;
                        s = bufferreader.Read(); //advance pointer
                        if ((char)s == ':')
                        {
                            reading_value = true;
                            continue;
                        }
                        if (reading_value && (char)s == ',')
                        {
                            //we know we just ended the line, so put itin our dictionary
                            if (!outdict.ContainsKey(keybufferbuilder.ToString())) outdict.Add(keybufferbuilder.ToString(), valuebufferbuilder.ToString());
                            //and clear the buffers
                            keybufferbuilder.Clear();
                            valuebufferbuilder.Clear();
                            reading_value = false;
                        }
                        if (reading_value && (char)s == '}')
                        {
                            //we know we just ended the line, so put itin our dictionary
                            if (!outdict.ContainsKey(keybufferbuilder.ToString())) outdict.Add(keybufferbuilder.ToString(), valuebufferbuilder.ToString());
                            //and clear the buffers
                            keybufferbuilder.Clear();
                            valuebufferbuilder.Clear();
                            reading_value = false;
                            reading = false;
                            break;
                        }
                    }
                    else
                    {
                        if (reading_value)
                        {
                            valuebufferbuilder.Append((char)s);
                            continue;
                        }
                        else
                        {
                            keybufferbuilder.Append((char)s);
                            continue;
                        }
                    }
                }
                else
                {
                    switch ((char)s)
                    {
                        case ':':
                            reading_value = true;
                            break;
                        default:
                            if (reading_value)
                            {
                                valuebufferbuilder.Append((char)s);
                            }
                            else
                            {
                                keybufferbuilder.Append((char)s);
                            }
                            break;
                    }
                }
            }
        }
        return outdict;
    }

-1voto

A.P.S Points 179

Vous utilisez la classe JSON et puis appelez la fonction GetData.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X