新年快樂:-)C#4反序列化JSON複雜的對象列表<int>
我有以下的JSON對象:
{
\"OutcomeSummaryID\":105,
\"DeliveryDetailsID\":9,
\"AttemptedDeliveryModesIDList\":[1,5],
}
,我使用下面的方法來反序列化:
private void SerializeModel<T>(IDictionary<string, object> dataModel, T myModel)
{
Type sourceType = typeof(T);
foreach (PropertyInfo propInfo in (sourceType.GetProperties()))
{
if (dataModel.ContainsKey(propInfo.Name))
{
// if an empty string has been returned don't change the value
if (dataModel[propInfo.Name].ToNullSafeString() != String.Empty)
{
try
{
Type localType = propInfo.PropertyType;
localType = Nullable.GetUnderlyingType(localType) ?? localType;
propInfo.SetValue(myModel, Convert.ChangeType(dataModel[propInfo.Name], localType), null);
}
catch (Exception e)
{
// ToDo: log serialize value errors
}
}
}
}
}
該模型的定義是:
public class DeliveryDetailsView
{
public int OutcomeSummaryID { get; set; }
public int DeliveryDetailsID { get; set; }
public List<int> AttemptedDeliveryModesIDList { get; set; }
}
當我運行,這是出現以下情況例外:
System.InvalidCastException was caught
Message=Object must implement IConvertible.
這是一個大項目的提取物和我已經使用這個方法廣泛的其他地方,但是這是第一次用一個列表作爲一個字段和我可以看不到乾淨的方式來解決這個問題。我可以使用
if (localType.IsCollectionType())
但是不知道從哪裏開始(Google的答案似乎都不符合這種情況,大部分都與XML有關)。
在此先感謝。
UPDATE
感謝@Cube下面我現在有一個部分答案。
if (localType.IsGenericType && localType.GetGenericTypeDefinition().Equals(typeof(List<>)))
{
Type localListType = localType.GetGenericArguments()[0];
if (localListType.Equals(typeof(int)))
{
IDictionary<string, object> dataItem = (Dictionary<string, object>)dataModel[propInfo.Name];
List<int> tempList = new List<int>();
foreach (var item in dataItem)
{
tempList.Add((int)item.Value);
}
propInfo.SetValue(perinatalModel, tempList, null);
}
}
...但是,所有嘗試將JSON數組轉換爲List都失敗。我也試圖
List<int> tempList = (List<int>)dataModel[propInfo.Name];
兩個拋出異常
Unable to cast object of type 'System.Object[]' ...
任何進一步的想法
感謝
感謝您的啓動;我真的(真的)需要的是如何處理JSON的extracint到我的模型的字段 –
dataModel [propInfo.Name]應該是可枚舉的東西。我認爲你必須重複它並建立一個List。 Probaly與新列表(dataModel [propInfo.Name])一樣簡單。這個列表應該適用於'propInfo.SetValue'。 'ChangeType'不會爲你完成這項工作。 –
CubeSchrauber
現在無法創建列表 - 請參閱上面的更新。再次感謝所有幫助。 –