我创建了以下类来表示对 REST API 请求的任何服务器响应:
[DataContract]
public class ServerResponse<T>
{
[DataMember(Name = "error")]
public string ErrorMessage { get; set; }
[DataMember(Name = "data")]
public T Data { get; set; }
[DataMember(Name = "success")]
public bool Success { get; set; }
}
将它与像这样的简单类一起使用时
[DataContract(Name = "category")]
public class Category
{
[DataMember(Name = "id")]
public int Id { get; set; }
[DataMember(Name = "name")]
public string Name { get; set; }
}
我得到以下响应
{
"error": "",
"data": {
"id": 3,
"name": "Top"
},
"success": true
}
我想在序列化中包含通用类型类名。想要的结果:
{
"error": "",
"data": {
"category": {
"id": 3,
"name": "Top"
}
},
"success": true
}
我该怎么做? (我在类似的帖子中看到过答案,但没有一个适用于像这样的一般场景)
最佳答案
如果它能帮助任何人,我会发布我的解决方法
我已经创建了一个自定义 Json 转换器
public class GenericTypeJsonSerializer : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
// Parse data object
var dataObject = JToken.FromObject(value);
// Extract generic type class serialization name
var className = ExtractClassName(value);
// Create wrapper object that includes generic class name
JObject wrapperObject = new JObject();
wrapperObject.Add(className, dataObject);
// write object
wrapperObject.WriteTo(writer);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override bool CanConvert(Type objectType)
{
return true;
}
public string ExtractClassName(object value)
{
// extract data contract attribute
var dataContractAttribute = value.GetType()
.GetCustomAttribute(typeof(DataContractAttribute)) as DataContractAttribute;
// return name declared in attribute
if (dataContractAttribute?.Name != null)
return dataContractAttribute.Name;
// return default class name
return value.GetType().Name;
}
}
我用 JsonConverter
属性修饰了通用 Data
属性
[JsonConverter(typeof(GenericTypeJsonSerializer))]
[DataMember(Name = "data")]
public T Data { get; set; }
这就是吹捧!
关于c# - 在 JSON 通用属性序列化中包含类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41969671/