c# - 在使用另一个类的值转换为 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"
}
解决方案
您需要一个自定义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);
}
}
推荐阅读
- java - Azure Function App:@EventHubTrigger 为每个 EventHubTrigger 函数设置不同的批处理大小
- c# - 为什么 OracleConnection.Open() 的实例在将 Oracle DB 从 11g 升级到 19c 后会抛出错误?
- python - 打印日期范围之间的所有星期四
- redirect - 将输出重定向到某个文件,同时在 Python 中重定向文件的 tail -f
- python - 使用 pytest 进行单元测试架构
- python - 如何按分组总和划分熊猫列中的元素
- python - 创建一个python函数来改变列的顺序
- python - 试图在 ubuntu 上为 django 设置 mysql 但出现错误 'django.db.utils.OperationalError: (1046, 'No database selected')'
- api - 从 Quickbooks TradeGecko API 获取历史库存水平
- java - 序言中不能有内容。在安卓工作室