2016-02-06 66 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