gpt4 book ai didi

c# - 使用不同的名称对 Json.Net 进行序列化和反序列化

转载 作者:太空狗 更新时间:2023-10-29 21:26:23 25 4
gpt4 key购买 nike

我正在从如下所示的 Web API 接收 JSON 数据:

[
{
"id": 1
"error_message": "An error has occurred!"
}
]

我将此数据反序列化为以下类型的对象:

public class ErrorDetails
{
public int Id { get; set; }

[JsonProperty("error_message")]
public string ErrorMessage { get; set; }
}

稍后在我的应用程序中,我想再次将 ErrorDetails 对象序列化为 JSON,但使用属性名称 ErrorMessage 而不是 error_message。所以结果看起来像这样:

[
{
"Id": 1
"ErrorMessage": "An error has occurred!"
}
]

有没有一种简单的方法可以使用 Json.Net 完成此操作?也许使用自定义解析器和一些属性,例如:

public class ErrorDetails
{
public int Id { get; set; }

[SerializeAs("ErrorMessage")]
[DeserializeAs("error_message")]
public string ErrorMessage { get; set; }
}

但是当我序列化或反序列化时解析器不告诉我。

最佳答案

您可以使用 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': 'An error has occurred!'}"


或者您可以创建一个可以决定使用哪个名称的契约(Contract)解析器。然后,您可以决定何时反序列化和序列化,是否要使用 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);

jsonNew = "{'Id': 1,'ErrorMessage': 'An error has occurred!'}"

关于c# - 使用不同的名称对 Json.Net 进行序列化和反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44632448/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com