كيفية إلغاء تسلسل بيانات JSON؟

سئل على ١٤ أغسطس ٢٠١٣  ·  تمت مشاهدة 101.8k مرة  ·  مصدر

eitan barazani picture
في ١٤ أغسطس ٢٠١٣

أنا جديد في التعامل مع بيانات JSON.

أنا أقرأ البيانات من خدمة الويب. بيانات الاستعلام التي تم إرسالها هي كالتالي:

[["B02001_001E","NAME","state"],
 ["4712651","Alabama","01"],
 ["691189","Alaska","02"],
 ["6246816","Arizona","04"],
 ["18511620","Florida","12"],
 ["9468815","Georgia","13"],
 ["1333591","Hawaii","15"],
 ["1526797","Idaho","16"],
 ["3762322","Puerto Rico","72"]]

هل هناك طريقة لإلغاء تسلسل هذه البيانات بحيث يتم إنشاء الكائن الأساسي بدون أن أحدد أولاً ما هو شكل الكائن؟ في المثال أعلاه ، يتم تحديد الكائن من خلال الصف الأول:

           ["B02001_001E","NAME","state"],

بشكل عام ، ستعيد خدمة الويب بيانات الاستعلام المنسقة كمصفوفة JSON ثنائية الأبعاد حيث يوفر الصف الأول أسماء الأعمدة وتوفر الصفوف اللاحقة قيم البيانات.

الإجابات

evanmcdonnal picture
في ١٤ أغسطس ٢٠١٣
45

يمكنك إلغاء تسلسل هذا بسهولة. بنية البيانات في C # هي فقط List<string[]> لذا يمكنك فعل ذلك ؛

  List<string[]> data = JsonConvert.DeserializeObject<List<string[]>>(jsonString);

يفترض الكود أعلاه أنك تستخدم json.NET.

تحرير: لاحظ أن json تقنيًا عبارة عن مصفوفة من مصفوفات السلسلة. أفضل استخدام List<string[]> للإعلان الخاص بي لأنه imo أكثر سهولة. لن يتسبب ذلك في أي مشاكل لـ json.NET ، إذا كنت تريد أن تكون مصفوفة من مصفوفات السلسلة ، فأنت بحاجة إلى تغيير النوع إلى (أعتقد) string[][] ولكن هناك بعض المسكات الصغيرة المضحكة مع خشنة والمصفوفات ثنائية الأبعاد في C # التي لا أعرف عنها حقًا ، لذا فأنا لا أزعج التعامل معها هنا.

Alexander Eroma picture
في ١٤ أغسطس ٢٠١٣
33

إذا كنت تستخدم .Net 4.5 ، يمكنك أيضًا استخدام جهاز تسلسلي .Net json القياسي

using System.Runtime.Serialization.Json;
...    
Stream jsonSource = ...; // serializer will read data stream
var s = new DataContractJsonSerializer(typeof(string[][]));
var j = (string[][])s.ReadObject(jsonSource);

في .Net 4.5 والإصدارات الأقدم ، يمكنك استخدام فئة JavaScriptSerializer:

using System.Web.Script.Serialization;
...
JavaScriptSerializer serializer = new JavaScriptSerializer();
string[][] list = serializer.Deserialize<string[][]>(json);
Category6 picture
في ١٤ أغسطس ٢٠١٣
0

الخطوة 1: انتقل إلى json.org للعثور على مكتبة JSON لأي تقنية تستخدمها للاتصال بخدمة الويب هذه. قم بالتنزيل والارتباط بهذه المكتبة.

الخطوة 2: لنفترض أنك تستخدم Java. يمكنك استخدام JSONArray مثل هذا:

JSONArray myArray=new JSONArray(queryResponse);
for (int i=0;i<myArray.length;i++){
    JSONArray myInteriorArray=myArray.getJSONArray(i);
    if (i==0) {
        //this is the first one and is special because it holds the name of the query.
    }else{
        //do your stuff
        String stateCode=myInteriorArray.getString(0);
        String stateName=myInteriorArray.getString(1);
    }
}
Zeeshan Amber picture
في ٣٠ أكتوبر ٢٠١٤
0

يمكنك كتابة محلل JSON الخاص بك وجعله أكثر عمومية بناءً على متطلباتك. هنا واحد خدم هدفي بشكل جيد ، آمل أن يساعدك أيضًا.

class JsonParsor
{
    public static DataTable JsonParse(String rawJson)
    {
        DataTable dataTable = new DataTable();
        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;
        bool reading_number = false;
        while (s >= 0)
        {
            s = bufferreader.Read();
            //open JSON
            if (!reading)
            {
                if ((char)s == '{' && !inside_string && !reading)
                {
                    reading = true;
                    continue;
                }
                if ((char)s == '}' && !inside_string && !reading)
                    break;
                if ((char)s == ']' && !inside_string && !reading)
                    continue;
                if ((char)s == ',')
                    continue;
            }
            else
            {
                if (reading_value)
                {
                    if (!inside_string && (char)s >= '0' && (char)s <= '9')
                    {
                        reading_number = true;
                        valuebufferbuilder.Append((char)s);
                        continue;
                    }
                }
                //if we find a quote and we are not yet inside a string, advance and get inside
                if (!inside_string)
                {
                    if ((char)s == '\"' && !inside_string)
                        inside_string = true;
                    if ((char)s == '[' && !inside_string)
                    {
                        keybufferbuilder.Length = 0;
                        valuebufferbuilder.Length = 0;
                                reading = false;
                                inside_string = false;
                                reading_value = false;
                    }
                    if ((char)s == ',' && !inside_string && reading_number)
                    {
                        if (!dataTable.Columns.Contains(keybufferbuilder.ToString()))
                            dataTable.Columns.Add(keybufferbuilder.ToString(), typeof(string));
                        if (!outdict.ContainsKey(keybufferbuilder.ToString()))
                            outdict.Add(keybufferbuilder.ToString(), valuebufferbuilder.ToString());
                        keybufferbuilder.Length = 0;
                        valuebufferbuilder.Length = 0;
                        reading_value = false;
                        reading_number = false;
                    }
                    continue;
                }

                //if we reach end of the string
                if (inside_string)
                {
                    if ((char)s == '\"')
                    {
                        inside_string = false;
                        s = bufferreader.Read();
                        if ((char)s == ':')
                        {
                            reading_value = true;
                            continue;
                        }
                        if (reading_value && (char)s == ',')
                        {
                            //put the key-value pair into dictionary
                            if(!dataTable.Columns.Contains(keybufferbuilder.ToString()))
                                dataTable.Columns.Add(keybufferbuilder.ToString(),typeof(string));
                            if (!outdict.ContainsKey(keybufferbuilder.ToString()))
                            outdict.Add(keybufferbuilder.ToString(), valuebufferbuilder.ToString());
                            keybufferbuilder.Length = 0;
                            valuebufferbuilder.Length = 0;
                            reading_value = false;
                        }
                        if (reading_value && (char)s == '}')
                        {
                            if (!dataTable.Columns.Contains(keybufferbuilder.ToString()))
                                dataTable.Columns.Add(keybufferbuilder.ToString(), typeof(string));
                            if (!outdict.ContainsKey(keybufferbuilder.ToString()))
                                outdict.Add(keybufferbuilder.ToString(), valuebufferbuilder.ToString());
                            ICollection key = outdict.Keys;
                            DataRow newrow = dataTable.NewRow();
                            foreach (string k_loopVariable in key)
                            {
                                CommonModule.LogTheMessage(outdict[k_loopVariable],"","","");
                                newrow[k_loopVariable] = outdict[k_loopVariable];
                            }
                            dataTable.Rows.Add(newrow);
                            CommonModule.LogTheMessage(dataTable.Rows.Count.ToString(), "", "row_count", "");
                            outdict.Clear();
                            keybufferbuilder.Length=0;
                            valuebufferbuilder.Length=0;
                            reading_value = false;
                            reading = false;
                            continue;
                        }
                    }
                    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 dataTable;
    }
}