簡體   English   中英

如何反序列化此json字符串以分類

[英]how do deserialize this json string to class

我有以下json字符串:

    {"Visits":[true,"DockedOnly","leftZone","0","500",0,0,0],
     "Weather":[true,"DockedOnly","leftZone","0","0",0,0,1],
     "ContactUs":[true,"DockedOnly","leftZone","0","317",0,0,2],
     "Birthdays":[true,"DockedOnly","middleZone","0","0",0,0,0],
     "Reminders":[true,"DockedOnly","middleZone","0","145",0,0,1],
     "Messages":[true,"DockedOnly","middleZone","0","0",0,0,2],
     "Availability":[true,"DockedOnly","middleZone","0","0",0,0,3],
     "Settings":[false,"DockedOnly","leftzone","0","155",0,0,0]}

無論如何,反序列化為以下內容?

    [Serializable]
    public class WidgetProps
    {
        public bool Visible { get; set; }
        public string DockState { get; set; }
        public string Zone { get; set; }
        public string Top { get; set; }
        public string Left { get; set; }
        public int UnusedA { get; set; }
        public int UnusedB { get; set; }
        public int Position { get; set; }
    }

    [Serializable]
    public class WidgetLayout
    {
        public WidgetProps Visits { get; set; }
        public WidgetProps Weather { get; set; }
        public WidgetProps ContactUs { get; set; }
        public WidgetProps Birthdays { get; set; }
        public WidgetProps Reminders { get; set; }
        public WidgetProps Messages { get; set; }
        public WidgetProps Availability { get; set; }
        public WidgetProps Settings { get; set; }
    }

要么

    public class Widget
    {
        public string WidgetName { get; set; }
        public WidgetProps props { get; set; }
    }

    List<Widget> MyWidgets;

我得到了json字符串,所以我無法更改它的賦給我的方式,但是也許我可以在得到它之后對其進行修補,以便它可以工作。

我試過了:

    string s = "{\"Visits\":[true,\"DockedOnly\",\"leftZone\",\"0\",\"500\",0,0,0],\"Weather\":[true,\"DockedOnly\",\"leftZone\",\"0\",\"0\",0,0,1],\"ContactUs\":[true,\"DockedOnly\",\"leftZone\",\"0\",\"317\",0,0,2],\"Birthdays\":[true,\"DockedOnly\",\"middleZone\",\"0\",\"0\",0,0,0],\"Reminders\":[true,\"DockedOnly\",\"middleZone\",\"0\",\"145\",0,0,1],\"Messages\":[true,\"DockedOnly\",\"middleZone\",\"0\",\"0\",0,0,2],\"Availability\":[true,\"DockedOnly\",\"middleZone\",\"0\",\"0\",0,0,3],\"Settings\":[false,\"DockedOnly\",\"leftzone\",\"0\",\"155\",0,0,0]}}";
    var sd = new JavaScriptSerializer().Deserialize < List<Widget>>(s);

    var sd = new JavaScriptSerializer().Deserialize < WidgetLayout >(s);

這不起作用,因為您正在嘗試將數組反序列化為對象。 json.NET解串器將無法進行該轉換。

因為您的json數組中有多種類型,所以必須將其反序列化為最小的公分母,在這種情況下為object 從那里,我建議編寫一種方法,將每個索引分配給WidgetProps中的相應屬性。

因此,基本上,定義此構造函數;

public WidgetProps(object[] props)
{
    Visible = (bool)props[0];
    DockState = (string)props[1];
    // ext
}

我會有像WidgetDirty類這樣的東西,我會對其進行初始反序列化。 在此處,您可以通過實例化其每個屬性(例如myWidgetLayoutInstance.Visits = new WidgetProp(myWidgetDirtyInstance.Visits);來創建WidgetLayout的新實例myWidgetLayoutInstance.Visits = new WidgetProp(myWidgetDirtyInstance.Visits); 我可能會隱藏這個爛攤子的WidgetLayout構造函數,一個WidgetDirty ,因為它是唯一的精氨酸。

是的,這真令人惡心……但是我不知道有什么真正的選擇,因為json的設計與C#語言不太兼容。 如果您對此有強烈的建議,我可能會看看dynamic類型。 我沒有在C#中使用過它,也許永遠不會使用它,但是我知道在像PHP這樣的動態語言中反序列化它根本沒有問題。

這是行不通的,因為通常不會將數組反序列化為對象。 如果可能的話,我認為您應該修復JSON。 如果無法做到這一點,並且您正在使用JSON.NET, JsonConverter以為WidgetProps創建JsonConverter ,以手動將數組轉換為對象:

class WidgetPropsConverter : JsonConverter
{
    public override void WriteJson(
        JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotSupportedException();
    }

    public override object ReadJson(
        JsonReader reader, Type objectType, object existingValue,
        JsonSerializer serializer)
    {
        var array = serializer.Deserialize<object[]>(reader);
        return new WidgetProps
        {
            Visible = (bool)array[0],
            DockState = (string)array[1],
            Zone = (string)array[2],
            Top = (string)array[3],
            Left = (string)array[4],
            Position = (int)(long)array[7]
        };
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(WidgetProps);
    }
}

然后,您可以像這樣使用它:

var result = JsonConvert.DeserializeObject<WidgetLayout>(
    jsonString, new WidgetPropsConverter());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM