使用Json.Net在输出中更改json属性名称 [英] Change json property name in output using Json.Net
问题描述
我正在尝试读取JSON文件,重命名属性名称,并使用新名称导出新的JSON.如本示例所述, https://www.newtonsoft.com/json/help/html/JsonPropertyName.htm ,我们可以使用JsonProperty在代码内部指定其他名称.但是,当您导出json时,它将返回原始名称.因此,在示例中,当它在控制台中登录时,它仍然返回"release_date"而不是"ReleaseDate".有什么方法可以在不创建全新对象的情况下进行此操作?
I am trying to read a JSON file, rename the property names, and export a new JSON with the new names. As stated in this example, https://www.newtonsoft.com/json/help/html/JsonPropertyName.htm, we can use JsonProperty to specify a different name internally in the code. However, when you export the json, it returns the original name. So in the example it still returned "release_date" instead of "ReleaseDate" when it was logged in the console. Is there any way to do this without creating a brand new object?
为使事情变得清晰,这是我尝试做的事的示例:
To clear things up, here is example of what I am trying to do:
JSON输入:
{ "name": "Starcraft", "release_date": "1998-01-01T00:00:00" }
用于反序列化数据的对象:
Object Used to deserialize the data:
public class Videogame
{
public string name{ get; set; }
[JsonProperty("release_date")]
public DateTime releaseDate { get; set; }
}
被称为的代码:
var json = JsonConvert.DeserializeObject<Videogame>(File.ReadAllText(path))
Console.WriteLine(JsonConvert.SerializeObject(json));
结果输出:
{ "name": "Starcraft", "release_date": "1998-01-01T00:00:00" }
所需的输出:
{ "name": "Starcraft", "releaseDate": "1998-01-01T00:00:00" }
我目前知道如何解决它的唯一方法是创建一个新对象,并使用它来序列化我的输出.不确定是否有任何更简单的方法可以做到这一点.
The only way that I currently know how to solve it is to create a new object and use it to serialize my output. Wasn't sure if there is any simpler way to do this.
推荐答案
您可以使用自定义解析来创建所需的行为:
You could use custom resolve to create desired behaviour:
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);
对 NtFreX 和他的答案.我提供的是我的信息,以便您指出问题已解决.
Kudos to NtFreX and his answer. I'm providing mine so that you can indicate that your question is resolved.
这篇关于使用Json.Net在输出中更改json属性名称的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!