首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >序列化Geckoboard趋势线小部件的JSON和省略属性名

序列化Geckoboard趋势线小部件的JSON和省略属性名
EN

Stack Overflow用户
提问于 2016-01-11 17:31:04
回答 1查看 54关注 0票数 1

试图为geckoboard小部件(趋势线)生成以下JSON

代码语言:javascript
复制
{
"item": [
    {
      "value": "274057"
    },
    [
      "38594",
      "39957",
      "35316",
      "35913",
      "36668",
      "45660",
      "41949"
    ]
  ]
}

这是我的模型:

代码语言:javascript
复制
    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:

代码语言:javascript
复制
"item": [
  {        
    "value": 223.0
  }
],
"": [
  "100",
  "102",
  "105",
  "109"
]

这里的问题完全相同:特定JSON / Geckoboard / Trendline小部件的C#类。只是不确定自定义序列化程序规则应该是什么样子。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-11 21:13:06

由于您的"items" JSON数组是非常多态的,由对象和嵌套数组组成,因此使用自定义JsonConverter来重写您的c#数据模型是最容易的:

代码语言:javascript
复制
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>() }) });
    }
}

然后,您可以按以下方式应用它:

代码语言:javascript
复制
[JsonConverter(typeof(NumberAndSecondaryStatConverter))]
public class NumberAndSecondaryStat
{
    public DataItem[] DataItems { get; set; }

    public List<string> TrendData { get; set; }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34727612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档