Rou*_*per 5 c# json json.net deserialization
我C#用来反序列化一组JSON字符串.每个字符串都有一个属性employer_normalized,该属性应该包含a,string并且List<int>其中的值List始终为正.在某些情况下employer_normalized被设置为-1,所以我想重写这些案件的一些行为,设置employer_normalized到null.
这是我的班级:
public class EmployerNormalized
{
public string company;
public List<int> code;
}
Run Code Online (Sandbox Code Playgroud)
好JSON
"employer_normalized": {
"company": "self",
"code": [
"4581 ",
"6732 ",
"9121",
"9999 ",
"5947 ",
"8322 ",
"8351 ",
"7335 ",
"9999 ",
"4225 ",
"8399 "
]
}
Run Code Online (Sandbox Code Playgroud)
坏JSON
"employer_normalized": -1
Run Code Online (Sandbox Code Playgroud)
我目前正在使用Json.NET我的JSON解析.解决这个问题的优雅解决方案是什么?如果是这样的话,最好将employer_normalized值设置null为-1?如果是这样,我该怎么做?
您可以使用自定义的 JsonConverter 来处理这种情况。无论您在哪里期望 a EmployerNormalized,转换器都可以检查该属性的值是否为-1null 并返回 null,否则正常反序列化它。
这是转换器的代码:
public class EmployerNormalizedConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(EmployerNormalized));
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JToken token = JToken.Load(reader);
if (token.Type == JTokenType.Object)
{
return token.ToObject<EmployerNormalized>();
}
return null;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个演示如何使用它的演示:
class Program
{
static void Main(string[] args)
{
string json = @"
{
""good"" : {
""company"": ""self"",
""code"": [
""4581 "",
""6732 "",
""9121"",
""9999 "",
""5947 "",
""8322 "",
""8351 "",
""7335 "",
""9999 "",
""4225 "",
""8399 ""
]
},
""bad"" : -1
}";
Wrapper wrapper =
JsonConvert.DeserializeObject<Wrapper>(json,
new EmployerNormalizedConverter());
DumpEmployer("good", wrapper.good);
DumpEmployer("bad", wrapper.bad);
}
private static void DumpEmployer(string prop, EmployerNormalized emp)
{
Console.WriteLine(prop);
if (emp != null)
{
Console.WriteLine(" company: " + emp.company);
Console.WriteLine(" codes: " +
string.Join(", ", emp.code.Select(c => c.ToString())));
}
else
Console.WriteLine(" (null)");
}
public class Wrapper
{
public EmployerNormalized good { get; set; }
public EmployerNormalized bad { get; set; }
}
public class EmployerNormalized
{
public string company;
public List<int> code;
}
}
Run Code Online (Sandbox Code Playgroud)
这是输出:
good
company: self
codes: 4581, 6732, 9121, 9999, 5947, 8322, 8351, 7335, 9999, 4225, 8399
bad
(null)
Run Code Online (Sandbox Code Playgroud)
重要提示:您可能会想用 来装饰该类EmployerNormalized,[JsonConverter(typeof(EmployerNormalizedConverter))]但如果这样做,那么当前形式的转换器将最终递归调用自身,直到出现错误StackOverflowException。如果您需要/想要使用该属性,则ReadJson需要更改转换器中方法的代码,以便手动创建该类的实例EmployerNormalized并单独填充其所有属性,而不是调用token.ToObject<EmployerNormalized>(). 这是一个替代版本,ReadJson可以避免递归问题:
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JToken token = JToken.Load(reader);
if (token.Type == JTokenType.Object)
{
EmployerNormalized employer = new EmployerNormalized();
employer.company = token["company"].ToString();
employer.code = token["code"].ToObject<List<int>>();
return employer;
}
return null;
}
Run Code Online (Sandbox Code Playgroud)