Frage

Ich versuche, mit einigen json formatierten Daten in C # zu arbeiten, aber ich einige Probleme habe die richtige Art und Weise zu bestimmen, das Problem zu nähern. Mein Problem ist, dass die json formatierten Daten in einem unbekannten Format sein wird (ich weiß, das klingt seltsam ... Bitte lesen Sie weiter). Grundsätzlich sind die json formatierten Daten werden einige Sammlung von Name / Wert-Paare, in denen die Werte können oder nicht verschachtelten Arrays von Name / Wert-Paare sein. Um die Dinge mehr Spaß zu machen, die Verschachtelung der Name / Wert-Paar-Arrays auf ad infinitum fortgesetzt werden kann.

Zum Beispiel:     Ich könnte einige Daten haben, die wie ...

sieht
{
    "1": {
        "1.1": {
            "1.1.1": "value1",
            "1.1.2": "value2",
            "1.1.3": "value3"
        },
        "1.2": "value4",
        "1.3": {
            "1.3.1": {
                "1.3.1.1": "value5",
                "1.3.1.2": "value6"
            },
            "1.3.1.2": "value7",
            "1.3.1.3": "value8"
        }
    }
}

Leider weiß ich nicht, wie viel Verschachtelung auftreten wird und technisch weiß ich nicht, welche Namen / Wert-Paare werden in einer bestimmten Nachricht vorhanden sein.

Gibt es einen Mechanismus unterstützt in C #, die mir ermöglichen würde, dies leicht zu einem verschachtelten Satz von hastables zu analysieren?

Ich möchte etwas entlang der Linien von dem tun (beachten Sie diesen Code nicht 100% syntaktisch korrekt und würde besser über Rekursion getan werden ... aber es erhalten ist die Idee across).

Hashtable ht = [deserialize data method](jsonformattedstring);
foreach (Hashtable nested in ht)
{
    If (nested.count > 1)
        {
        Foreach (hashtable next in nested)
        …
        }
}
War es hilfreich?

Lösung

Ich habe nicht wie die .Net Json Parsing ... es hat einige seltsame Dinge gelegentlich. Ich habe an Json.NET , eine Open-Source-Bibliothek. Es hat ein schönes JObject Objekt, das zu tun, was Sie brauchen.

Andere Tipps

In .NET, haben Sie die JsonArray , mit dem Sie die JSON-Daten laden ermöglicht und analysieren. Es schafft eine Reihe von JsonValue und es vollständig auf den JSON-Daten basierend verschachtelt ist es analysiert.

Wenn Sie speziell Hashtable benötigen, können Sie die Daten aus JsonArray übersetzen könnte, obwohl Hastable alle, aber für Wörterbuch ist veraltet.

Josh Holmes hat eine ziemlich gute "Getting Started" Post über JSON in .NET: http://www.joshholmes.com/blog/2009/01/ 20 / PlayingWithJSON.aspx

Sie können unter http://techblog.procurios.nl/k/n618/news/view/14605/14863/How-do-I-write-my-own-parser-for- JSON.html Es ist eine einfache Bibliothek, die einen JSON-String in Hashtables und Arraylisten analysiert. Es kann auch diese Strukturen in JSON wieder ein.

Hier ist eine Methode, die ich in C # geschrieben JSON zu analysieren und ein Wörterbuch zurückzukehren. Natürlich ist es für alle Anwendungsfälle nicht geeignet, aber so etwas wie dies Ihnen ein schönes One-Pass-Parsing des JSON geben:

/*
     * 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;
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top