c# - 如何序列化 json 以显示属性值而不是属性名称?
问题描述
我正在尝试找到一种将对象序列化为以下格式的json字符串的方法,这样我就可以满足项目要求
{
"id": 123456,
"los": {
"2019-05-13": [
{
"currency": "EUR",
"guests": 2,
"price": [
100,
200
]
},
{
"currency": "EUR",
"guests": 3,
"price": [
150,
250
]
}
],
"2019-05-14": {
"currency": "EUR",
"guests": 2,
"price": [
300
]
}
},
}
我创建了这些模型类:
public class Rootobject
{
public Los los { get; set; }
public int Id { get; set; }
}
public class Los
{
public Item[] items{ get; set; }
}
public class Item
{
public DateTime date {get;set;}
public string currency { get; set; }
public int guests { get; set; }
public int[] price { get; set; }
}
在序列化过程中可以以某种方式更改元素的名称,因此 Item 被序列化为“2019-05-13”、“2019-05-14”等?
解决方案
为此,您需要这个类结构:
public class Rootobject
{
public int Id { get; set; }
[JsonConverter(typeof(CustomItemConverter))]
public Dictionary<DateTime, Item[]> Los { get; set; }
}
public class Item
{
[JsonIgnore]
public DateTime Date { get; set; }
public string Currency { get; set; }
public int Guests { get; set; }
public int[] Price { get; set; }
}
和自定义转换器:
public class CustomItemConverter : JsonConverter
{
public override bool CanRead => false;
public override bool CanConvert(Type objectType)
{
return objectType == typeof(Dictionary<DateTime, Item[]>);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var dictionary = (Dictionary<DateTime, Item[]>)value;
writer.WriteStartArray();
foreach (var item in dictionary)
{
writer.WriteStartObject();
writer.WritePropertyName(item.Key.Date.ToString("yyyy-MM-dd"));
serializer.Serialize(writer, item.Value);
writer.WriteEndObject();
}
writer.WriteEndArray();
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException("Unnecessary because CanRead is false. The type will skip the converter.");
}
}
推荐阅读
- amazon-web-services - AWS EC2 独立实例 Windows,我可以在云形成中包含启动停止计划吗?
- string - 如何使用定义的位置从 awk 编辑输出行?
- c# - .NET Core WebSocket(使用 HttpListener)通过 Apache - 我得到 404 而不是 101
- subprocess - 我想应用 python 子进程来遵循三个命令,但我没有这样做?
- sql - SQL .How to:从以 data.PIR 开头的表中选择 *
- typescript - 通用打字稿类型定义,包括。原始类型
- sql-server - 使用触发器更新具有多行的多个表
- google-bigquery - 如何在 Apache Beam 中定期从 BigQuery 读取数据?
- postgresql - docker容器容纳多个数据库
- powershell - LDAP 查询以将 OU 与自定义关键字匹配?