c# - Newtonsoft JsonConvert.SerializeObject 使用属性名称 insted [JsonProperty("")]
问题描述
我的项目中有一个类,需要针对两个不同的用例进行序列化。由于我无法在属性上添加两个不同的属性,因此我想使用 [JsonProperty("attributname")] decleration 一次序列化该类的对象,并使用其自身的属性名称序列化一次。
例如:
public class Contact
{
[JsonProperty("name")]
public string Lastname { get; set; }
}
public class Program
{
public void SerializeByJsonPropertyName()
{
var contact = new Contact()
{
Lastname = "Harber"
}
var requestJson = JsonConvert.SerializeObject(contact);
// Serialized Object requestJson:
// {
// "name" = "Harber"
// }
}
public void SerializeByPropertyName()
{
var contact = new Contact()
{
Lastname = "Harber"
}
var requestJson = JsonConvert.SerializeObject(contact /*, ? Setting ?*/);
// Serialized Object requestJson:
// {
// "Lastname" = "Harber"
// }
}
}
第一个 szenario 工作得很好,但对于第二个 szenario 我找不到任何解决方案。除了创建两个类或在我的类中复制属性.. Newtonsofts JsonConverter 中是否有任何设置可以做到这一点?
谢谢你的帮助!
解决方案
你可以创建不同的命名策略,然后创建不同的设置,每个设置都有一个合约解析器,每个合约解析器都有一个命名策略,然后你为每个设置提供你想要使用的命名策略,像这样
public static class JsonSerializingSettings {
public static JsonSerializerSettings JsonUnModified{ get; set; } = new JsonSerializerSettings
{
ContractResolver = new DefaultContractResolver() {
NamingStrategy = new UnmodifiedNamingStrategy()
}
};
public static JsonSerializerSettings JsonDefault { get; set; } = new JsonSerializerSettings
{
ContractResolver = new DefaultContractResolver() {
NamingStrategy = new DefaultNamingStrategy()
}
};
}
public class UnmodifiedNamingStrategy : NamingStrategy {
protected override string ResolvePropertyName(string name) {
return name;
}
}
当你想使用它时
var requestJson = JsonConvert.SerializeObject(contact,JsonSerializingSettings.JsonDefault);
// Serialized Object requestJson:
// {
// "name" = "Harber"
// }
var requestJson = JsonConvert.SerializeObject(contact,JsonSerializingSettings.JsonUnModified);
// Serialized Object requestJson:
// {
// "Lastname" = "Harber"
// }
推荐阅读
- numpy - 计算插值数据的二阶导数
- swift - 如何在复制/粘贴 Xcode 时修复损坏的缩进
- protocol-buffers - io.grpc.StatusRuntimeException:未实现:未知服务 opencensus.proto.agent.metrics.v1.MetricsService
- java - 如何使用 Spinner 下拉菜单更改 TextView 小部件上的文本
- javascript - 如何使用 javascript 代码从 webgl 着色器中获取统一值
- javascript - 如果为负数或正数,如何更改数字的颜色?
- sql-server - 如何通过 PowerShell(Azure CLI)启用“允许 Azure 服务和资源访问此服务器”?
- c# - 在 PipeReader 中查找 byte[]
- docker - docker-compose 构建失败,没有这样的文件或目录
- python - 在图例上添加标签不起作用,使用 matplotlib