【发布时间】:2021-02-25 10:57:36
【问题描述】:
我在尝试反序列化某些 json 时遇到了一些麻烦,因为它带有来自服务器的非转义双引号。由于我无权在服务器端修复此问题,因此我试图忽略有问题的 json。为此,我遵循了这些答案https://stackoverflow.com/a/21542099/2779990 和Ignore parsing errors during JSON.NET data parsing。当我使用errorArgs.ErrorContext.Handled = true; 时,响应对象是null。
所以我实现了自己的转换器:
public class FieldConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(FieldOperationDomain);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
FieldDomain field = new FieldDomain();
try
{
JObject jObject = JObject.Load(reader);
JToken name = jObject["Name"];
if (name.Type == JTokenType.String)
{
field.Name = (string)name;
}
else
{
field.Name = null;
}
JToken value = jObject["Value"];
if (value.Type == JTokenType.String)
{
field.Value = (string)value;
}
else
{
field.Value = null;
}
return field;
} catch (Exception e)
{
return new FieldDomain
{
Name = "",
Value = ""
};
}
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
我的 json 看起来像这样:
[
{
"id": "1d5c9ea3-7eb3-4fff-b8da-0a4dec891054",
"RecordType": 1,
"Field": []
},
{
"id": "1d5c9ea3-7eb3-4fff-b8da-0a4dec891054",
"RecordType": 1,
"Field": [
{
"Name": "something",
"Value": "Other something"
},
{
"Name": "something",
"Value": "Problematic "Other something""
}
]
}
]
我的域对象如下所示:
public class MainDomain
{
[JsonProperty("id")]
public long RecordType { get; set; }
[JsonProperty("RecordType")]
public long RecordType { get; set; }
[JsonProperty("Fields")]
public IEnumerable<Field> Fields { get; set; }
}
[JsonConverter(typeof(FieldOperationConverter))]
public class FieldDomain
{
[JsonProperty("Name")]
public string Name { get; set; }
[JsonProperty("Value")]
public string Value { get; set; }
[OnError]
internal void OnError(StreamingContext context, ErrorContext errorContext)
{
errorContext.Handled = true;
}
}
我什至还尝试将其添加到有问题的对象中:
[OnError]
internal void OnError(StreamingContext context, ErrorContext errorContext)
{
errorContext.Handled = true;
}
问题是即使使用 try catch 块来捕获 JObject jObject = JObject.Load(reader); 上的任何异常,这也不能阻止 JsonConvert.DeserializeObject<IEnumerable<T>>(document, settings); 抛出异常。可以在ReadJson 方法中执行类似于errorArgs.ErrorContext.Handled = true; 的操作吗?
【问题讨论】:
标签: c# json json.net deserialization