2014-08-30 72 views
4

我有這樣的代碼:反序列化,其中可以爲T的單個T類型的對象或數組列表<T>

var json = GetJsonData(path); 
JObject event_dates_data = JObject.Parse(json); 
var event_dates_list = JObject.Parse(event_dates_data["document"]["date"].ToString()); 
var event_dates = JsonConvert.DeserializeObject<List<EventDate>>(event_dates_list.ToString()); 

JSON可能包含一個數組的物體(例如「日期:[{},{ },{}]「)或僅一個(例如, 」日期:{}「)

的Json看起來像這樣:

{ 
"document": { 
"result": "success", 
"resultcode": "000000", 
"note": null, 
"totaldates": "1", 
"date": { 
    "date_id": "351314", 
    "live": "n", 
    "datestart": "2012-03-07", 
    "dateend": "2015-03-07", 
    "timestart": "12:00", 
    "timeend": "14:00", 
    "date_available": "10000" 
} 
} 
} 

或者:

{ 
"document": { 
"result": "success", 
"resultcode": "000000", 
"note": null, 
"totaldates": "4", 
"date": [ 
    { 
    "date_id": "346022", 
    "live": "n", 
    "datestart": "2011-02-19", 
    "dateend": "2011-02-19", 
    "timestart": "12:00", 
    "timeend": "14:00", 
    "date_available": "10000" 
    }, 
    { 
    "date_id": "346023", 
    "live": "n", 
    "datestart": "2011-02-20", 
    "dateend": "2011-02-20", 
    "timestart": "12:00", 
    "timeend": "14:00", 
    "date_available": "10000" 
    }, 
    { 
    "date_id": "346024", 
    "live": "n", 
    "datestart": "2011-02-21", 
    "dateend": "2011-02-21", 
    "timestart": "12:00", 
    "timeend": "14:00", 
    "date_available": "10000" 
    }, 
    { 
    "date_id": "546580", 
    "live": "y", 
    "datestart": "2015-08-15", 
    "dateend": "2015-08-15", 
    "timestart": "12:00", 
    "timeend": "14:00", 
    "date_available": "10000" 
    } 
] 
} 
} 

我對「日期」的POCO:

public class EventDate { 

    [JsonProperty("date_id")] 
    public string Id { get; set; } 


    [JsonProperty("live")] 
    [JsonConverter(typeof(AvailableForSalesFiledConverter))] 
    public bool AvailableForSales { get; set; } 


    [JsonProperty("datestart")] 
    public string DateStart { get; set; } 


    [JsonProperty("dateend")] 
    public string DateEnd { get; set; } 


    [JsonProperty("timestart")] 
    public string TimeStart { get; set; } 


    [JsonProperty("timeend")] 
    public string TimeEnd { get; set; } 


    [JsonProperty("date_available")] 
    public int DateAvailable { get; set; } 
} 

所以,當我試圖反序列化我得到異常: 「不能反序列化JSON當前對象(例如因爲該類型需要一個JSON數組(例如[1,2,3,4,5,7,9, \ r \ n到 修復此錯誤或者將JSON更改爲JSON數組(例如[1,2,3]) 或更改反序列化類型,以使其成爲正常的.NET類型 (例如,不是像整數這樣的原始類型,也不是像數組或列表的集合類型) 可以從JSON對象反序列化。 JsonObjectAttribute也可以加入到 類型,迫使它從一個JSON對象反序列化。\ r \ n路徑「DATE_ID」,2號線,13位」 我怎樣才能得到它的列表?

回答

-2

首先,在類轉換類的實例中RootObject到列表中,例如:

class RootObject 
{ 
public List<Class1> Property1 { get; set; } 
} 

現在您可以訪問的項目在類如清單

+0

您錯過了這個問題的重點 - 有時該屬性是一個數組,有時它是一個單一的對象。如果您將其聲明爲列表,則當JSON具有單個對象時將不起作用,反之亦然。解決方案不僅僅是改變類聲明(儘管這是它的一部分)。 – 2014-08-30 14:42:10

0

我有點疑惑,因爲它似乎你。在那裏做事情的混雜。

我建議你創建一個代表你的數據爲一個類的POCO對象。它應該有DateTime類型的列表,以及一個EventDate,當你序列化,你只需序列化整個類爲:

var my_poco = // create your object here; 
var poco_as_json = Newtonsoft.Json.JsonConvert.SerializeObject(my_poco); 

// You then save that to a file (I assume that's what you're doing) 

// Get it back will look like: 
var back_from_json = Newtonsoft.Json.JsonConvert 
            .DeserializeObject<your_poco_class>(json); 

// and then simply use the object's lists: 
var dates = back_from_json.event_dates_list; // list of dates 
var events = = back_from_json.events;   // list of events? 

你的POCO是唯一的事件日期。
你需要與其餘變量另一個POCO:

「文件」, 「結果」, 「resultCode爲」, 「注意」, 「totaldates」, 「日期」

它會大概可以稱爲document,totaldates將是一個int,而date將是List<DateEvent>
這就是你要序列化和反序列化。

+0

謝謝你的回答。我編輯了我的帖子,請再次查看。 – Vitach 2014-08-30 11:39:10

+0

downvoter ...原因? – Noctis 2014-08-31 13:56:52

1
var json = GetJsonData(path); 
JObject event_dates_data = JObject.Parse(json); 
var event_dates_list = JObject.Parse(event_dates_data["document"]["date"].ToString()); 
event_dates_list = string.Format("[{0}]", event_dates_list.Trim('[', ']')); 
var event_dates = JsonConvert.DeserializeObject<List<EventDate>>(event_dates_list.ToString()); 
+0

當然..它的工作原理。但我想應該有一些來自Json.Net庫的標準方法。 – Vitach 2014-08-30 12:50:50

+0

我不這麼認爲。 – brz 2014-08-30 13:12:47

+3

使用JsonConverter是一個比手動操縱JSON並重新解析它更好的解決方案。查看鏈接的重複問題和答案。 – 2014-08-30 14:53:24

相關問題