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

序列化和反序列化要列出的索引字段名

  •  2
  • Pretasoc  · 技术社区  · 5 年前

    我正在使用一个Webservice,它返回(并期望)一些不寻常的格式JSON。它不使用列表或字典,而是使用编号字段模式:

    {
        // some normal fields
        "col0" : "First column name",
        "val0" : "First value",
        "col1" : "Second column name",
        "val1" : "Second value",
        // ...
        "coln" : "n-th column name",
        "valn" : "n-th value"
    } 
    

    我想将这些值序列化/反序列化到/从 Dictionary<string, string> 属性使用json.net。

    1 回复  |  直到 5 年前
        1
  •  2
  •   Pretasoc    5 年前

    json.net提供了反序列化其他属性的机制。使用它引入私有财产并用 JsonExtensionDataAttribute 指示反序列化程序存储无法映射到SE字典中的所有属性。如果类型是序列化的,则此字典中的所有值也将存储。填充扩展字典resp。你可以使用的公共字典 OnDeserialized 负责人。 OnSerializing 回调。

    [JsonIgnore]
    public Dictionary < string, string > Columns {get;} = new Dictionary <string, string>();
    
    [JsonExtensionData()]
    private Dictionary < string, JToken > _additionalData {get; set;}
    
    [OnDeserialized]
    private void OnDeserialized(StreamingContext context)
    {
        int i = 0;
        while (_additionalData.TryGetValue($ "col{i}", out JToken column))
        {
            var value = _additionalData[$ "val{i}"];
            Columns.Add(column.ToObject < string > (), value.ToObject < string > ());
            i++;
        }
    }
    
    [OnSerializing]
    private void OnSerializing(StreamingContext context)
    {
        int i = 0;
        _additionalData = new Dictionary < string, JToken > ();
        foreach(var item in Columns)
        {
            _additionalData.Add($ "col{i}", item.Key);
            _additionalData.Add($ "val{i}", item.Value);
            i++;
        }
    }