c# - 如何像基类一样序列化属性?
问题描述
我有一个这样的对象:
[JsonObject]
public class Thing<T> where T: class
{
[JsonProperty()]
T Data { get; set; }
[JsonProperty("error")]
public int ErrorCode { get; set; }
}
有没有办法让它序列化它,以便它给出这样的东西,例如,当T
一个类具有单个值属性时:
{ value: "content", error: 1 }
而不是这个:
{ data: { value: "content" }, error: 1 }
我很遗憾不能从数据类派生。
解决方案
您将需要一个自定义转换器,例如:
[JsonConverter(typeof(HasValueConverter))]
public class HasValue
{
public HasValue(string value)
{
this.Value = value;
}
public string Value { get; set; }
}
[JsonObject]
public class Thing<T> where T: class
{
[JsonProperty("value")]
public T Data { get; set; }
[JsonProperty("error")]
public int ErrorCode { get; set; }
}
class HasValueConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(HasValue);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return new HasValue(JToken.Load(reader).Value<string>());
}
public override bool CanWrite => false;
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
[Test]
public void Deserializes()
{
var json = "{ value: \"content\", error: 1 }";
var thing = JsonConvert.DeserializeObject<Thing<HasValue>>(json);
Assert.AreEqual("content", thing.Data.Value);
}
推荐阅读
- javascript - 在角度 5 中验证同一字段中的电子邮件和电话号码
- python - 如何将 lxml.etree._XSLTResultTree 转换为 python 中的元组?
- php - 如何在php中安装作曲家以进行条带支付?
- java - Gradle - 复制多模块项目构建中所有更改模块的 jar
- sql - 如何设置Bit类型输入参数可选设置默认为false
- c - C: 如何访问存储在 void 指针 (void *) 中的函数指针?
- javascript - 如何检查 youtube 中的视频是否直播或使用 youtube iframe api 上传
- php - Iam 无法将解析连接到我的服务器
- java - 无法获取从 ejb 返回到 liferay 控制器的确切 dto
- node.js - 在 nodejs 应用程序中集成 Google 登录 API