序列化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#类。只是不确定自定义序列化程序规则应该是什么样子。

序列化JSON并省略Geckoard趋势线小部件的属性名称

由于"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; }
}