使用Json.Net在输出中更改json属性名称 [英] Change json property name in output using Json.Net

查看:69
本文介绍了使用Json.Net在输出中更改json属性名称的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试读取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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆