【发布时间】:2021-07-18 08:09:12
【问题描述】:
我想在运行时设置属性名称。我已经为序列化实现了这一点。
例如。我有一个简单的模型,如下所示:
[JsonConverter(typeof(DataModelConverter))]
public class DataModel
{
public string Name { get; set; }
public int Age { get; set; }
}
我有一个简单的DataModelConverter,它继承自JsonConverter:
public class DataModelConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
Type type = value.GetType();
JObject jo = new JObject();
foreach (PropertyInfo prop in type.GetProperties())
{
jo.Add(prop.Name == "Name" ? "FullName" : prop.Name, new JValue(prop.GetValue(value)));
}
jo.WriteTo(writer);
}
public override bool CanRead
{
get { return false; }
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override bool CanConvert(Type objectType)
{
return objectType == typeof(DataModel);
}
}
我有一个简单的控制器,如下所示:
[Route("api/[controller]")]
[ApiController]
public class NewtonController : ControllerBase
{
public IEnumerable<DataModel> GetNewtonDatas([FromBody] DataModel input)
{
return new List<DataModel>()
{
new DataModel
{
Name="Ramil",
Age=25
},
new DataModel
{
Name="Yusif",
Age=26
}
};
}
}
如果我调用此 API,结果将如下所示(显示全名而不是名称):
[
{
"FullName": "Ramil",
"Age": 25
},
{
"FullName": "Yusif",
"Age": 26
}
]
但是我有一个问题。这不适用于反序列化。
例如:如果我用这个body调用这个API,那么Name将null。
{
"FullName":"Ramil"
}
我的属性不适用于反序列化。我想通过 attribute 设置属性名称,以便在运行时进行反序列化。
我不想使用一些中间件,我只想通过在运行时使用 any 属性来实现这一点。我必须从我的 appsettings.json 文件中读取 JSON 属性名称。
感谢您的帮助!
【问题讨论】:
-
好吧,您已经覆盖
CanRead以返回false,因此在反序列化期间将永远不会调用您的转换器。由于"FullName"没有与Name属性相同的(大小写不变)名称,Name属性,它永远不会被设置。但是你为什么要从CanRead返回false?为什么不直接将[JsonProperty("FullName")]应用于Name? -
@dbc 我必须从我的 appsettings.json 文件中读取 json 属性名称。因此我需要在运行时设置它们。感谢您的回复,我检查 CanRead。
-
By 我不想使用一些中间件,我只想通过在运行时使用any属性来实现。你的意思是你不想使用自定义合同解析器?如果您使用自定义合同解析器,您可以动态重命名属性,请参见例如Use different name for serializing and deserializing with Json.Net 或例如Newtonsoft JSON dynamic property name.
-
@dbc 谢谢,我将 CanRead 更改为 true,ReadJson 现在调用。请将其标记为答案,我会接受。谢谢!
标签: asp.net-core serialization json.net deserialization