当字符串缺少C#类所需的属性时,我想Json.NET抛出一个.JsonSerializationExceptionJson
有MissingMemberHandling Enumeration哪些
在反序列化期间遇到缺少的成员时抛出JsonSerializationException.
但我认为这与我想要的相反.我认为这意味着c#类中缺少一个成员.我想要一个失踪的Json成员.
我的代码是
public MyObj Deserialise(string json)
{
var jsonSettings = new JsonSerializerSettings();
jsonSettings.MissingMemberHandling = MissingMemberHandling.Error;
return JsonConvert.DeserializeObject<ApiMessage>(json, jsonSettings);
}
Run Code Online (Sandbox Code Playgroud)
例如
public class MyObj
{
public string P1 { get; set; }
public string P2 { get; set; }
}
string json = @"{ ""P1"": ""foo"" }";
Run Code Online (Sandbox Code Playgroud)
json缺少P2.我想知道这是什么情况.
谢谢.
我正在使用Newtonsoft.Json将我的webservice的输出反序列化为一个对象.它工作正常,直到我Bitmap向我的班级(命名User)添加一个属性来持有一个头像.
Web服务将该属性作为Base64字符串返回,这是预期的.问题是当我尝试将JSON从WS转换回a时List<User>,JsonSerializationException会抛出一个代码块:
// T is IList<User>
response.Content.ReadAsStringAsync().Proceed(
(readTask) =>
{
var json = ((Task<string>)readTask).Result;
var result = JsonConvert.DeserializeObject<T>(json); //<-- it fails here
// do stuff!
});
Run Code Online (Sandbox Code Playgroud)
异常输出是:
Error converting value "System.Drawing.Bitmap" to type 'System.Drawing.Bitmap'. Path '[2].Avatar
Run Code Online (Sandbox Code Playgroud)
并查看内部异常:
{"Could not cast or convert from System.String to System.Drawing.Bitmap."}
Run Code Online (Sandbox Code Playgroud)
很明显,它无法解析Base64字符串,但目前尚不清楚原因.
任何想法/解决方法?
编辑
我知道我可以使用Convert.FromBase64Stringdo得到一个字节数组并从中加载一个位图.然后,我想更新我的问题想请教一下如何我可以跳过或手动解析唯一的那场.我想避免,不得不手动解析所有JSON.这甚至可能吗?
编辑2
我发现了根本问题:在Web服务中没有正确序列化JSON(我不明白为什么).我认为这是一个有点不同的问题,但没有.我的webservice只是返回一个字符串"System.Drawing.Bitmap"而不是它的base64内容.因此JsonSerializationException.
我一直无法解决这个问题,我发现的唯一解决方案是将我的领域变成一个byte [].
我有一个JSON字符串,我希望能够删除一些数据.
以下是JSON响应:
{
"ResponseType": "VirtualBill",
"Response": {
"BillHeader": {
"BillId": "7134",
"DocumentId": "MN003_0522060",
"ConversionValue": "1.0000",
"BillType": "Vndr-Actual",
"AccountDescription": "0522060MMMDDYY",
"AccountLastChangeDate": "06/07/2016"
}
},
"Error": null
}
Run Code Online (Sandbox Code Playgroud)
从上面的JSON响应我想删除
"ResponseType": "VirtualBill",部分,使它看起来像这样:
{
"Response": {
"BillHeader": {
"BillId": "7134",
"DocumentId": "MN003_0522060",
"ConversionValue": "1.0000",
"BillType": "Vndr-Actual",
"AccountDescription": "0522060MMMDDYY",
"AccountLastChangeDate": "06/07/2016"
}
},
"Error": null
}
Run Code Online (Sandbox Code Playgroud)
有没有一种简单的方法在C#中执行此操作?
我正在为我的模型使用实体框架,我需要将它们序列化为JSON.问题是EF包含了所有这些非常好的导航集合(例如我的用户模型上有一个Orders属性),当我去序列化这些对象时,序列化程序试图获取这些集合的值,EF对我大喊大叫使用处置的上下文
ObjectContext实例已被释放,不能再用于需要连接的操作.
我知道我可以使用[ScriptIgnore]来装饰我的属性,以使序列化器不管它们,但这就是EF的一个问题,因为它为这些属性生成了代码.
有没有办法使序列化程序不序列化通用类型EntityCollection <>的属性?
或者有没有办法用另一个像JSON.Net这样强大的json库来做到这一点?