json.net - Json转换继承字典的对象

标签 json.net

我有以下类定义:

public class ElasticObject : Dictionary<string, object>
{
    public int Id { get;set;}
}

var keyValues = new ElasticObject();
keyValues.Id= 200000;
keyValues.Add("Price", 12.5);
var json = JsonConvert.SerializeObject(keyValues,
           new JsonSerializerSettings{NullValueHandling = NullValueHandling.Ignore});

解析后的json字符串为{"Price":12.5},不包含Id属性,有没有办法自定义json转换?

最佳答案

您可以通过创建自定义 JsonConverter 类来实现此目的。也许是这样的:

class ElasticObjectConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(ElasticObject));
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        ElasticObject eobj = (ElasticObject)value;
        var temp = new Dictionary<string, object>(eobj);
        temp.Add("Id", eobj.Id);
        serializer.Serialize(writer, temp);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var temp = serializer.Deserialize<Dictionary<string, object>>(reader);
        ElasticObject eobj = new ElasticObject();
        foreach (string key in temp.Keys)
        {
            if (key == "Id")
                eobj.Id = Convert.ToInt32(temp[key]);
            else
                eobj.Add(key, temp[key]);
        }
        return eobj;
    }
}

然后你可以像这样使用它:

var settings = new JsonSerializerSettings
{
    NullValueHandling = NullValueHandling.Ignore,
    Converters = new List<JsonConverter> { new ElasticObjectConverter() }
};

var keyValues = new ElasticObject();
keyValues.Id = 200000;
keyValues.Add("Price", 12.5);

var json = JsonConvert.SerializeObject(keyValues, settings);

上面生成的 JSON 如下所示:

{"Price":12.5,"Id":200000}

这是您要找的吗?

关于json.net - Json转换继承字典的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17919797/

相关文章:

JSON.NET - 只读属性和对 IgnoreDataMember 的支持

c# - 将 Newtonsoft JSON 序列化为字节数组

c# - 将 Json 数组解析为 C# 中的类

c# - JSON.NET - 选择所有对象

c# - json_agg() 数组到对象

c# - 如何在使用 Newtonsoft.Json 序列化 json 时忽略默认值

c# - Azure 按需 Web 作业未收到格式正确的 json 序列化字符串

c# - 当类的名称是根元素时,Newtonsoft json 不会反序列化

c# - Json 反序列化 protected 属性

c# - Newtonsoft JSON.NET 与 Json Web 服务的兼容性