Aet*_*rix 7 c# serialization json
我正在从如下所示的Web API接收JSON数据:
[
{
"id": 1
"error_message": "An error has occurred!"
}
]
Run Code Online (Sandbox Code Playgroud)
我将此数据反序列化为以下类型的对象:
public class ErrorDetails
{
public int Id { get; set; }
[JsonProperty("error_message")]
public string ErrorMessage { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
稍后在我的应用程序中,我想再次将ErrorDetails对象序列化为JSON,但使用属性名称ErrorMessage代替error_message。因此结果将如下所示:
[
{
"Id": 1
"ErrorMessage": "An error has occurred!"
}
]
Run Code Online (Sandbox Code Playgroud)
Is there an easy way I can accomplish this with Json.Net? Perhaps using a custom resolver and some attributes like:
public class ErrorDetails
{
public int Id { get; set; }
[SerializeAs("ErrorMessage")]
[DeserializeAs("error_message")]
public string ErrorMessage { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
But the resolver doesn't tell me when I'm serializing or deserializing.
您可以使用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!'}";
Run Code Online (Sandbox Code Playgroud)
对于反序列化,您可以使用SnakeCaseNamingStrategy。
var dezerializerSettings = new JsonSerializerSettings
{
ContractResolver = new DefaultContractResolver
{
NamingStrategy = new SnakeCaseNamingStrategy()
}
};
var obj = JsonConvert.DeserializeObject<ErrorDetails>(json, dezerializerSettings);
Run Code Online (Sandbox Code Playgroud)
要再次序列化对象,您不必更改,JsonSerializerSettings因为默认情况下将使用属性名称。
var jsonNew = JsonConvert.SerializeObject(obj);
Run Code Online (Sandbox Code Playgroud)
jsonNew =“ {'Id':1,'ErrorMessage':'发生错误!'}”
或者,您可以创建合同解析器来决定要使用的名称。然后,您可以决定何时使用反序列化和序列化,以使用pascal案例名称格式还是带下划线的格式。
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);
Run Code Online (Sandbox Code Playgroud)
jsonNew =“ {'Id':1,'ErrorMessage':'发生错误!'}”
| 归档时间: |
|
| 查看次数: |
3433 次 |
| 最近记录: |