你如何从jquery预订日历pro反序列化json?

时间:2014-07-06 12:17:40

标签: c# deserialization json

我正在使用jquery插件http://envato-help.dotonpaper.net/booking-calendar-pro-jquery-plugin.html进行日历控件。 日历会返回JSON,如下所示。

    "YYYY-MM-DD":{"available": "", // Number of Available Items
                  "bind": 0, // Set if a day is a part of a group (0 = none; 1 = first day of a group; 2 = in the group; 3 = last day of a group)
                  "info": "", // Day informations
                  "notes": "", // Day notes
                  "price": "", // Price
                  "promo": "", // Promotional Price
                  "status": ""}, // Day status (none, available, booked, special, unavailable)
    // Another day              
    "YYYY-MM-DD":{"available": "",
                  "bind": 0,
                  "info": "",
                  "notes": "",
                  "price": "",
                  "promo": "",
                  "status": ""}

我很难理解如何将其转换为对象,因为嵌套。日期不应该是名称,而不是实际数据吗?

我知道我可以使用这样的词典,

var serializer = new JavaScriptSerializer();
var result = serializer.DeserializeObject(s);

但我宁愿有一个合适的对象。可以用这个JSON字符串完成吗?

2 个答案:

答案 0 :(得分:2)

首先,我建议使用Newtonsoft.Json而不是预先打包的JavaScriptSerializer,即使微软现在正在使用它,并且已经停止进入JavaScriptSerializer组件的进一步开发据我所知。 Newtonsoft.Json更快更容易使用。有关详细信息,请参阅http://james.newtonking.com/json

无论您选择哪种序列化程序,都可以对两者应用以下内容(可能某些类/方法名称不同):

我认为这里最简单的方法是声明Dictionary<string, DayInfo>并尝试使用Deserialize<T>方法而不是DeserializeObject对其进行反序列化。

您需要自己定义一个DayInfo类,其中包含您希望反序列化的所有属性,可能包含所有这些属性,例如:

public class DayInfo {
    public string Available { get; set; } // would map to the "available" property in the JSON
    public int Bind { get; set; } // would map to the "bind" property in the JSON
    // ...
}

您需要确保在DayInfo上定义的属性类型正确。

反序列化应该是:

var dictionary = serializer.Deserialize<Dictionary<string, DayInfo>>(jsonString);

将JSON反序列化为Dictionary<string, DayInfo>后,您仍然可以应用进一步的转换以转换为您认为的正确对象

答案 1 :(得分:0)

感谢PermaFrost的answer生成的代码。

public class DayInfo
{
    public string Available { get; set; }
    public int Bind { get; set; } 
    public string Info { get; set; }
    public string Notes { get; set; }
    public string Price { get; set; }
    public string Promo { get; set; }
    public string Status { get; set; }
}

....然后......

using Newtonsoft.Json;

[HttpPost]
public void SaveCalendarData()
{
    string json = Request.Form["dopbcp_schedule"];
    Dictionary<string, DayInfo> calendarData = JsonConvert.DeserializeObject<Dictionary<string, DayInfo>>(json);

    // Process dictionary...
}

在html / javascript中

$(document).ready(function () {

    /* Set up the calendar */
    $('#backend').DOPBackendBookingCalendarPRO({
         'SaveURL': '/Calendar/SaveCalendarData'
    });

// Code omitted....