代码之家  ›  专栏  ›  技术社区  ›  fluter

未能理想化异构json数据

  •  2
  • fluter  · 技术社区  · 7 年前

    { "keyXXX" : [[1,2,3,...]...], "last": 12345 }
    

    问题是“key”也是数据的一部分,它不是一个名为“key”的字段,所以我不能使用类/结构,我必须使用 IDictionary<string, int[][]> 对于第一部分,但“最后”部分将引发异常,因为它是单个整数而不是数组数组。

    var dec = JsonConvert.DeserializeObject<IDictionary<string, int[][]>>(data);
    

    Newtonsoft.Json。JsonSerializationException:将值1501555920转换为类型“System.Decimal[][]”时出错。路径“last”。

    //define a class
    public class DPInfo
    {
        public decimal[][] points { get; set; }
        public long last { get; set; }
    }
    var dec = JsonConvert.DeserializeObject<DPInfo>(data);
    

    points

    有什么办法可以解决这个问题吗?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Brian Rogers    7 年前

    你需要定制 JsonConverter

    public class DPInfoConverter : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            return objectType == typeof(DPInfo);
        }
    
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            JObject obj = JObject.Load(reader);
            JProperty points = obj.Properties().FirstOrDefault(p => p.Name != "last");
    
            DPInfo info = new DPInfo
            {
                key = points.Name,   // remove this line if you don't need the key
                points = points.Value.ToObject<decimal[][]>(),
                last = (long)obj["last"]
            };
    
            return info;
        }
    
        public override bool CanWrite
        {
            get { return false; }
        }
    
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            throw new NotImplementedException();
        }
    }
    

    [JsonConverter] 属性到您的类:

    [JsonConverter(typeof(DPInfoConverter))]
    public class DPInfo
    {
        public string key { get; set; }   // remove this line if you don't need the key
        public decimal[][] points { get; set; }
        public long last { get; set; }
    }
    

    然后,像往常一样反序列化,它应该可以工作:

    string json = @"
    {
      ""keyXXX"": [[1, 2, 3]],
      ""last"": 12345
    }";
    
    DPInfo info = JsonConvert.DeserializeObject<DPInfo>(json);
    

    小提琴: https://dotnetfiddle.net/7S6STp

        2
  •  1
  •   Nisarg Shah    7 年前

    你可以用 JObject.Parse 将字符串解析为 dynamic

    在您的情况下,声明如下所示:

    dynamic data = JObject.Parse("{ 'keyXXX' : [[1,2,3,...]...], 'last': 12345 }");