سؤال

منذ كائن المهيآت هي مشابهة جدا JSON, و الآن هناك مجهول أنواع .صافي.أنه سيكون من الرائع أن تكون قادرا على اتخاذ سلسلة ، مثل سلمان و إنشاء الكائن المجهول الذي يمثل سلسلة JSON.

استخدام الكائن المهيآت لخلق مجهول النوع:

var person = new {
    FirstName = "Chris",
    LastName = "Johnson"
};

سيكون رائعا إذا كنت يمكن أن تمر في سلسلة تمثيل الكائن مهيئ رمز (يفضل أن يكون شيئا مثل JSON) إنشاء مثيل من مجهول النوع مع تلك البيانات.

أنا لا أعرف إذا كان من الممكن منذ C# ليس ديناميكية و المترجم يحول الواقع الكائن غير مهيئد مجهول النوع في بشدة كتابة التعليمات البرمجية التي يمكن تشغيلها.هذا هو موضح في هذه المادة.

ربما وظائف اتخاذ JSON و إنشاء مفتاح/قيمة القاموس مع ذلك سوف تعمل بشكل أفضل.

وأنا أعلم أنك يمكن أن تسلسل/deserializer كائن JSON في .صافي ولكن ما أنا ابحث عن طريقة إنشاء كائن الذي هو في الأساس كتبته فضفاضة ، على غرار كيف جافا سكريبت يعمل.

لا أحد يعرف الحل الأفضل لفعل هذا .الشبكة ؟

تحديث:أيضا توضيح سياق السبب أنا أسأل هذا...كنت أفكر في كيفية C# أن أفضل دعم JSON في مستوى اللغة (ربما) و كنت أحاول التفكير في السبل التي يمكن القيام به اليوم ، المفاهيمي الأسباب.لذا فكرت بعد ذلك هنا لبدء المناقشة.

هل كانت مفيدة؟

المحلول

وهناك لغات ل. NET التي لديها بطة الكتابة ولكن هذا غير ممكن مع C # باستخدام Dot.Notation منذ C # يتطلب أن جميع الإشارات عضوا يتم حلها في وقت الترجمة. إذا كنت ترغب في استخدام Dot.Notation، لا يزال لديك لتحديد فئة في مكان ما مع الخصائص المطلوبة، واستخدام أيا كانت الطريقة التي تريد مثيل الفئة من البيانات JSON. قبل تحديد فئة <م> لا لها فوائد مثل الكتابة قوية، دعم IDE بما في ذلك التحسس، وليس القلق بشأن الأخطاء الإملائية. يمكنك الاستمرار في استخدام أنواع غير معروفة:

 T deserialize<T>(string jsonStr, T obj) { /* ... */}

 var jsonString = "{FirstName='Chris', LastName='Johnson, Other='unused'}";
 var person     = deserialize(jsonString, new {FirstName="",LastName=""});
 var x          = person.FirstName; //strongly-typed

نصائح أخرى

يجب أن تحقق من JSON.net المشروع:

http://james.newtonking.com/pages/json-net.aspx

كنت أساسا تتحدث عن القدرة على ترطيب كائن من سلمان ، والتي سوف تفعل هذا.انها لن تفعل مجهول أنواع ، ولكن ربما سوف تحصل على وثيقة بما فيه الكفاية.

ولقد كتبت وسيلة قصيرة نسبيا من شأنها أن تحليل JSON وإرجاع قاموس الاسم / القيمة التي يمكن الوصول إليها على غرار الكائن الفعلي في جافا سكريبت.

وفيما يلي عينة من استخدام طريقة أدناه:

var obj = ParseJsonToDictionary("{FirstName: \"Chris\", \"Address\":{Street:\"My Street\",Number:123}}");

// Access the Address.Number value
object streetNumber = ((Dictionary<string, object>)obj["Address"])["Number"];

و، وهنا رمز للأسلوب ParseJsonToDictionary:

public static Dictionary<string, object> ParseJsonToDictionary(string json)
{
    var d = new Dictionary<string, object>();

    if (json.StartsWith("{"))
    {
        json = json.Remove(0, 1);
        if (json.EndsWith("}"))
            json = json.Substring(0, json.Length - 1);
    }
    json.Trim();

    // Parse out Object Properties from JSON
    while (json.Length > 0)
    {
        var beginProp = json.Substring(0, json.IndexOf(':'));
        json = json.Substring(beginProp.Length);

        var indexOfComma = json.IndexOf(',');
        string endProp;
        if (indexOfComma > -1)
        {
            endProp = json.Substring(0, indexOfComma);
            json = json.Substring(endProp.Length);
        }
        else
        {
            endProp = json;
            json = string.Empty;
        }

        var curlyIndex = endProp.IndexOf('{');
        if (curlyIndex > -1)
        {
            var curlyCount = 1;
            while (endProp.Substring(curlyIndex + 1).IndexOf("{") > -1)
            {
                curlyCount++;
                curlyIndex = endProp.Substring(curlyIndex + 1).IndexOf("{");
            }
            while (curlyCount > 0)
            {
                endProp += json.Substring(0, json.IndexOf('}') + 1);
                json = json.Remove(0, json.IndexOf('}') + 1);
                curlyCount--;
            }
        }

        json = json.Trim();
        if (json.StartsWith(","))
            json = json.Remove(0, 1);
        json.Trim();


        // Individual Property (Name/Value Pair) Is Isolated
        var s = (beginProp + endProp).Trim();


        // Now parse the name/value pair out and put into Dictionary
        var name = s.Substring(0, s.IndexOf(":")).Trim();
        var value = s.Substring(name.Length + 1).Trim();

        if (name.StartsWith("\"") && name.EndsWith("\""))
        {
            name = name.Substring(1, name.Length - 2);
        }

        double valueNumberCheck;
        if (value.StartsWith("\"") && value.StartsWith("\""))
        {
            // String Value
            d.Add(name, value.Substring(1, value.Length - 2));
        }
        else if (value.StartsWith("{") && value.EndsWith("}"))
        {
            // JSON Value
            d.Add(name, ParseJsonToDictionary(value));
        }
        else if (double.TryParse(value, out valueNumberCheck))
        {
            // Numeric Value
            d.Add(name, valueNumberCheck);
        }
        else
            d.Add(name, value);
    }

    return d;
}

وأنا أعلم أن هذا الأسلوب قد يكون الخام قليلا، وربما يمكن أن يكون الأمثل لا بأس به، ولكن هذا المشروع الأول وأنها تعمل تماما.

وأيضا، قبل أن تعترض على ذلك لا تستخدم التعابير العادية، نأخذ في الاعتبار أن ليس كل من يفهم حقا التعابير العادية، والكتابة على هذا النحو من شأنها أن تجعل في أكثر صعوبة للآخرين لإصلاح إذا لزم الأمر. أيضا، وأنا حاليا لا أعرف التعبير العادية بشكل جيد للغاية، وكان سلسلة التوزيع فقط أسهل.

وأنت لا يمكن إرجاع نوع مجهول من أسلوب **، لذلك "ممهى" وجود نوع مجهول من شأنه أن يقتصر على الأسلوب الذي يتم ممهى ذلك. نوع من العبث.

و** يمكنك إعادته ككائن (الذي يتطلب التفكير للوصول خصائصه - yeech) أو يمكنك "يلقي من قبل سبيل المثال"، التي لا طائل كذلك، لأنه يأخذ خطوات اضافية وهذا يعني أنك بالفعل تعرف ما هو نوع الكائن يجب أن تبدو، فلماذا لا مجرد إنشاء كائن وملء عنه في المقام الأول؟

ما هو تطبيق لهذا ؟

وأود أن لا تذهب في هذا الطريق لعدة أسباب.

  • الأولى ؛ قد تحتاج إلى الكثير من الدعم التعليمات البرمجية باستخدام انعكاس هذه لخلق شفافية الأسلوب الذي تتحدث عنه.

  • ثانيا كما قلت, C# هو بقوة كتابة اللغة و مثل هذه الأمور تركت من مواصفات اللغة لسبب ما.

  • الثالث ، الحمل على فعل هذا لن يكون يستحق كل هذا العناء.تذكر أن صفحات الويب (خصوصا اياكس الاستفسارات) يجب أن تكون سريعة حقا أو الهزائم الغرض.إذا كنت المضي قدما وقضاء 50% التسلسلية الأشياء الخاصة بك بين C# و جافا سكريبت ثم لديك مشكلة.

الحل سيكون إنشاء فئة فقط بتغليف القاموس أن يأخذ سلسلة JSON باعتباره المنشئ الحجة.ثم تمتد تلك الفئة لكل نوع من سلمان الاستعلام كنت ترغب في التعامل معها.وسوف يكون هذا كتبته بقوة و أسرع حل ولكن لا تزال تحافظ على التمدد و سهولة الاستخدام.الجانب السلبي هو أن هناك ما هو أكثر من رمز إلى الكتابة في نوع من طلب سلمان.

:)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top