首页 > 解决方案 > 在使用另一个类的值转换为 json 时动态转换类属性名称

问题描述

我有两节课

// contains names/keys for JSON serialization
public class Mapping
{
    public string Id { get; set; }
    public string Name { get; set; }
}

// contains values for JSON serialization
public class Data
{
    public string Id { get; set; }
    public string Name { get; set; }
}

var map = new Mapping { Id = "Code", Name = "Tiltle" };
var data = new Data { Id = "Test1234", Name = "testname1234" };

所以当data使用来自的映射进行序列化时map,JSON 应该是这样的

{
   "Code":"Test1234"
   "Tiltle":"testname1234"
}

标签: c#json

解决方案


您需要一个自定义JsonConverter,并且因为您的map对象是在运行时创建的(我想),所以转换器也必须在运行时创建。

尝试:

var settings = new JsonSerializerSettings();
settings.Converters.Add(new PropertyNameFromMapTypeJsonConverter(map, typeof(Test2)));
var json = JsonConvert.SerializeObject(Data, settings);

转换器:

class PropertyNameFromMapTypeJsonConverter : JsonConverter
{
    private readonly IDictionary<string, object> _mappings;
    private readonly Type _targetType;

    public PropertyNameFromMapTypeJsonConverter(object mapObj, Type targetType)
    {
        // mapobj is instance of Test1
        // Use reflection to create a dictionary used as mappings between Test1 and 2
        _mappings = TypeDescriptor.GetProperties(mapObj)
            .OfType<PropertyDescriptor>()
            .ToDictionary(prop => prop.Name, prop => prop.GetValue(mapObj));

        _targetType = targetType;
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == _targetType;
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        // Do not support deserialize
        throw new NotSupportedException();
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var dict = TypeDescriptor.GetProperties(value)
            .OfType<PropertyDescriptor>()
            .ToDictionary(prop => _mappings[prop.Name], prop => prop.GetValue(value));

        serializer.Serialize(writer, dict);
    }
}

推荐阅读