2016-02-06 103 views
0

我有我的數據庫模型具有版本中,當我GET對象的C#版本是byte[8]但在JSON,對象似乎是一個字符串:AAAAAAAACXc=要精確。序列化和反序列化實體框架版本

當我從我的js應用程序中執行POST時,我的控制器接受動態c#對象,因爲數據可以是任何派生類,我需要能夠處理所有對象。

目前,我這樣做是爲了反序列化對象:

... Post([FromBody]dynamic data) 
{ 
    var jsonObj = JsonConvert.DeserializeObject(data.ToString()); 

    //This line errors out 
    CareTaker careTaker = JavaScriptSerializer().Deserialize<CareTaker>(jsonObj.ToString()); 
} 

但我得到一個錯誤:

exceptionMessage: "Cannot convert object of type 'System.String' to type 'System.Byte[]'"

因爲在CareTaker類中,Version屬性被定義爲一個byte[]但json字符串顯示爲AAAAAAAACXc= ..

如何將此版本字符串轉換爲其原始格式在:[0 0 0 0 0 0 9 119]

謝謝。

我想我會手動覆蓋這個動態屬性值的字節數組,所以走這條路線。我試圖將字符串轉換爲正常的字節數組,但它似乎長度超過8,結束EF引發驗證錯誤,說它應該是字符串或長度爲8的byte[] ...

+0

您是否在使用'Json.NET'和'System.Web.Script.Serialization'進行反序列化?爲什麼不使用'Json.NET'來反序列化到'CareTaker'? – GeorgeChond

+0

@GeorgeChond哎呀,我試着如果我其中任何一個會做得更好,所以這是一個神器,'Json.net'只是返回null值爲我的​​所有對象,所以我堅持與MS一現在 – LocustHorde

回答

1

您重新打破了所有混合JsonConvert和JavaScriptSerializer。

首先,而不是反序列化/序列化/反序列化,爲什麼不使用JToken?

var token = JToken.Parse(data.ToString()); 

通過這種方式,您可以獲得一個像集合的對象,您可以在其中訪問成員並檢查其類型。

並以這種方式,你可以再做

var deserObj = token.ToObject<theType>(); 

它還會糾正你有一個字節[]的問題,因爲Json.net將看到屬性是一個字節數組,該數據是一個base64字符串,它將負責轉換數據。

+0

nope,它不是因爲有一個ToString,該函數只看到一個字符串,沒有別的,你有一個非常舊的版本或其他一些具有相同名稱的類,嘗試使用Newtonsoft.Json.Linq.JToken .Parse(data.ToString()) – Gusman

+0

對不起,忽略我的最後一條評論,我在ToString中有一個小類型,因爲它是在一個動態對象上,所以VS被拋棄了。但是這個工作非常好,非常感謝你向我介紹'JToken'! – LocustHorde