您可以利用JsonSerializerSettings
、ContractResolver和NamingStrategy。
public class ErrorDetails
{
public int Id { get; set; }
public string ErrorMessage { get; set; }
}
var json = "{'Id': 1,'error_message': 'An error has occurred!'}";
你可以使用SnakeCaseNamingStrategy
进行反序列化。
var dezerializerSettings = new JsonSerializerSettings
{
ContractResolver = new DefaultContractResolver
{
NamingStrategy = new SnakeCaseNamingStrategy()
}
};
var obj = JsonConvert.DeserializeObject<ErrorDetails>(json, dezerializerSettings);
为了再次序列化对象,您无需更改
JsonSerializerSettings
,因为默认设置将使用属性名称。
var jsonNew = JsonConvert.SerializeObject(obj)
jsonNew = "{'Id': 1,'ErrorMessage': '发生错误了!'}"
或者您可以创建一个合同解析器,它可以决定使用哪个名称。 然后,您可以在反序列化和序列化时决定是否要使用带有下划线的帕斯卡命名格式或名称。
public class CustomContractResolver : DefaultContractResolver
{
public bool UseJsonPropertyName { get; }
public CustomContractResolver(bool useJsonPropertyName)
{
UseJsonPropertyName = useJsonPropertyName;
}
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member, memberSerialization);
if (!UseJsonPropertyName)
property.PropertyName = property.UnderlyingName;
return property;
}
}
public class ErrorDetails
{
public int Id { get; set; }
[JsonProperty("error_message")]
public string ErrorMessage { get; set; }
}
var json = "{'Id': 1,'error_message': 'An error has occurred!'}";
var serializerSettings = new JsonSerializerSettings()
{
ContractResolver = new CustomContractResolver(false)
};
var dezerializerSettings = new JsonSerializerSettings
{
ContractResolver = new CustomContractResolver(true)
};
var obj = JsonConvert.DeserializeObject<ErrorDetails>(json, dezerializerSettings);
var jsonNew = JsonConvert.SerializeObject(obj, serializerSettings);
jsonNew = "{'Id': 1,'ErrorMessage': '发生了一个错误!'}"
SnakeCaseNamingStrategy
。请参见此处以了解如何使用它的示例。 - dbc