环境:
Net 4.5
Newtonsoft.Json 13.0.0.0
场景:
{
"Age": "25",
"Name": "czj"
}
客户给我上面这样的json串,让反序列化后,修改对象后,再需要序列化输出如下格式:
{
"年龄": "28",
"姓名": "qwe"
}
添加特性:
public class CrJsonAttribute : Attribute
{
/// <summary>
/// 序列化名称
/// </summary>
public string SerializeName { get; set; }
/// <summary>
/// 反序列名称
/// </summary>
public string DeserializeName { get; set; }
/// <summary>
/// 可序列化
/// </summary>
public bool EnableSerialize { get; set; }
/// <summary>
/// 可反序列化
/// </summary>
public bool EnableDeserialize { get; set; }
public CrJsonAttribute()
{
this.EnableSerialize = true;
this.EnableDeserialize = true;
}
}
添加:DefaultContractResolver 解析器
/// <summary>
/// 反序列化解析器
/// </summary>
public class OcrDeserializeResolver : DefaultContractResolver
{
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member, memberSerialization);
var attr = member.GetCustomAttribute(typeof(CrJsonAttribute)) as CrJsonAttribute;
if (attr != null)
{
property.PropertyName = attr.DeserializeName ?? property.PropertyName;
property.Writable = attr.EnableDeserialize;
}
return property;
}
}
/// <summary>
/// 序列化解析器
/// </summary>
public class OcrSerializeResolver : DefaultContractResolver
{
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member, memberSerialization);
var attr = member.GetCustomAttribute(typeof(CrJsonAttribute)) as CrJsonAttribute;
if (attr != null)
{
property.PropertyName = attr.SerializeName ?? property.PropertyName;
property.Readable = attr.EnableSerialize;
}
return property;
}
}
添加实体Student:
public class Student
{
[CrJsonAttribute(SerializeName = "姓名")]
public string Name { get; set; }
[CrJsonAttribute(SerializeName = "年龄")]
public string Age { get; set; }
}
program:
static void Main(string[] args)
{
string json = "{\"Age\":\"25\",\"Name\":\"czj\"}";
var settings = new JsonSerializerSettings() { ContractResolver = new OcrDeserializeResolver() };
Student result = JsonConvert.DeserializeObject<Student>(json, settings);
result.Age = "28";
result.Name = "qwe";
settings = new JsonSerializerSettings() { ContractResolver = new OcrSerializeResolver() };
var content = JsonConvert.SerializeObject(result, settings);
//output:{"姓名":"qwe","年龄":"28"}
}