تمرير سلسلة JSON المجمع إلى 1 معلمة WebMethod في C # - deverialize في كائن (json.net)؟

StackOverflow https://stackoverflow.com/questions/1087928

سؤال

لقد كنت سعيدا تسلسل مع كائنات جافا سكريبت في JSON باستخدام

         JSON.stringify

وإرسال جنبا إلى جنب إلى WebMethod WebMethod الخاص بي في C # / ASP.NET وبالتأكيد وصوله .. أحتاج إلى العدد الصحيح من المعلمات وبالتالي إذا كان كائن JSON الخاص بي يحتوي على "Startdate"، "EndDate"، "الاحتياطي" ثم احتياجات الويب الخاصة بي هذه كمعلمات.

"بشكل أساسي مع كائن طلبي الذي لدي، لدي عدد من المعلمات على هذا الكائن حتى أحتاج إلى استخدام نفس الرقم على WebMethod - هذا فوضوي بعض الشيء؟" - أنا سأشرح

لدي كائن "ترتيب" معقد إلى حد ما في JavaScript وترغب في تسلسله باستخدام خطوات وإرساله إلى جانب الويب الخاص بي، لكنني لا أريد تحديد جميع المعلمات هل هناك طريقة حول هذا؟

كنت آمل أن يكون هناك شيء مثل هذا على WebMethod

           public static bool MakeReservation(object order)

ثم في Webmethod الخاص بي، لدي فقط معلمة واحدة ولكن يمكنني ذلك، ثم استمتع ذلك إلى كائن C # الحقيقي باستخدام JSON.NET. لقد جربت ذلك مثل إرسال JSON عبر JSON ولكن لأن هناك معلمة واحدة فقط على WebMethod الخاص بي.

أساسا ما أحاول أن أقوله إذا كنت أريد الاستمرار في استخدام WebMethod الخاص بي، لكنني لا أريد القيام به تحديد 15 معلمة على WebMethod

أريد أن تصل سلسلة JSON إلى WebMethod الخاص بي ثم يمكنني تحللها على الخادم.

هل هذا ممكن؟

هنا هو الطريقة التي أرسلها حاليا JSON إلى الخادم (WebMethod) باستخدام JQuery

    var jsonData = JSONNew.stringify(orderObject);

    $.ajax({
        type: "POST",
        url: "MyService.aspx/DoReservation",
        data: jsonData,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(msg) {
            success = true;
        },
        error: function(msg) {
            success = false;
        },
        async: false
    });
هل كانت مفيدة؟

المحلول

إذا حاولت تقديم كائن يشبه هذا:

JSON.stringify({ endDate: new Date(2009, 10, 10), startDate: new Date() });

سيحاول الخريطة وبدء تشغيل المعلمات المقابلة في WebMethod الخاص بك. نظرا لأنك ترغب فقط في قبول طريقة واحدة، أظن أنك قد تفلت عنها من خلال تقديم ما يلي:

JSON.stringify({ order: orderObject });

التي قد تحاول بشكل معقول تعيينها كقيمة لمعلمة "ترتيب" من WebMethod الخاص بك. فشل ذلك، تقديم

JSON.stringify({ order: JSON.stringify(orderObject) });

ثم التحيز باستخدامه باستخدام JSON.NET يجب أن يعمل بالتأكيد، لكنه قبح، لذلك جرب المثال الأول أولا. هذه هي أفضل لقطة.

نصائح أخرى

انه ممكن. أنا لست جيدا في شرح الأشياء، سأظهر لك فقط رمز المثال:

جافا سكريبت:

var Order = function(name, orderid, price) {
this.name = name;
this.orderid = orderid;
this.price = price;}

var pagePath = window.location.pathname;

function setOrder() {
var jsOrder = new Order("Smith", 32, 150);
var jsonText = JSON.stringify({ order: jsOrder });
$.ajax({
    type: "POST",
    url: pagePath + "/SetOrder",
    contentType: "application/json; charset=utf-8",
    data: jsonText,
    dataType: "json",
    success: function(response) {
        alert("wohoo");
    },
    error: function(msg) { alert(msg); }
});
}

C # رمز وراء

public class Order
{
 public string name { get; set; }
 public int orderid { get; set; }
 public int price { get; set; }
}

[WebMethod]
public static void SetOrder(object order)
{
    Order ord = GetOrder(order);
    Console.WriteLine(ord.name +","+ord.price+","+ord.orderid);        
}
public static Order GetOrder(object order)
{
    Order ord = new Order();
    Dictionary<string,object> tmp = (Dictionary<string,object>) order;
    object name = null;
    object price = null;
    object orderid = null;
    tmp.TryGetValue("name", out name);
    tmp.TryGetValue("price", out price);
    tmp.TryGetValue("orderid", out orderid);
    ord.name = name.ToString();
    ord.price = (int)price;
    ord.orderid = (int) orderid;
    return ord;
}

الكود الخاص بي ليست جميلة ولكن آمل أن تحصل على معنى ذلك.

لقد مرت مؤخرا عن هذه المشكلة ذاتها مع كائن JSON COMPLY أردت أن ألغيت في جهاز التحكم الخاص بي. الفرق الوحيد هو أنني كنت أستخدم البرنامج المساعد .tojson على العميل بدلا من.

الجواب السهل:

public static bool MakeReservation(string orderJSON)
{
    var serializer = new JavaScriptSerializer();
    var order = serializer.Deserialize<Order>(orderJSON);
}

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

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