序列化JSON并省略Geckoard趋势线小部件的属性名称
本文关键字:属性 小部 趋势线 JSON Geckoard 序列化 | 更新日期: 2023-09-27 18:29:54
尝试为壁虎板小部件(趋势线)生成以下JSON
{
"item": [
{
"value": "274057"
},
[
"38594",
"39957",
"35316",
"35913",
"36668",
"45660",
"41949"
]
]
}
这是我的型号:
public class NumberAndSecondaryStat
{
[JsonProperty("item")]
public DataItem[] DataItems { get; set; }
[JsonProperty("")]
public List<string> TrendData { get; set; }
}
public class DataItem
{
[JsonProperty("value")]
public decimal? Value { get; set; }
}
生成的JSON有几个问题,但我最大的问题是让属性名称消失。
我生成的JSON:
"item": [
{
"value": 223.0
}
],
"": [
"100",
"102",
"105",
"109"
]
这里的问题完全相同:针对特定JSON/Geckoard/Trendline小部件的C#类。只是不确定自定义序列化程序规则应该是什么样子。
由于"items"
JSON数组是极其多态的,由对象和嵌套数组组成,因此使用自定义JsonConverter
将c#数据模型重写为JSON:和从JSON:
public class NumberAndSecondaryStatConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(NumberAndSecondaryStat);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null)
return null;
var token = JToken.Load(reader).SelectToken("item");
if (token == null)
return null;
var value = (existingValue as NumberAndSecondaryStat) ?? new NumberAndSecondaryStat();
value.DataItems = token.OfType<JObject>().Select(o => o.ToObject<DataItem>()).ToArray();
value.TrendData = token.OfType<JArray>().SelectMany(a => a.Select(i => (string)i)).ToList();
return value;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var stat = (NumberAndSecondaryStat)value;
serializer.Serialize(writer, new { item = (stat.DataItems ?? Enumerable.Empty<object>()).Concat(new[] { stat.TrendData ?? Enumerable.Empty<string>() }) });
}
}
然后您可以按如下方式应用它:
[JsonConverter(typeof(NumberAndSecondaryStatConverter))]
public class NumberAndSecondaryStat
{
public DataItem[] DataItems { get; set; }
public List<string> TrendData { get; set; }
}