【问题标题】:C# Reference earlier JSON element - NewtonsoftC# 参考较早的 JSON 元素 - Newtonsoft
【发布时间】:2017-10-12 09:43:51
【问题描述】:

我正在序列化一个具有List<X>Dictionary<X, Y> 的对象。

List<X> 正在序列化,没有任何问题。 然而,为了序列化字典,我实现了一个自定义转换器。

class XYDictionaryConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return typeof(Dictionary<X, Y>).IsAssignableFrom(objectType);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JObject jObject = JObject.Load(reader);

        Dictionary<X, Y> dictionary = new Dictionary<X, Y>();

        foreach (JProperty property in jObject.Properties())
        {
            X key = //Get Y using property.Name

            if (key != null)
            {
                dictionary.Add(key, property.Value.ToObject<Y>());
            }
        }

        return dictionary;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        IDictionary<X, Y> dictionary = (IDictionary<X, Y>)value;

        JObject jObject = new JObject();

        foreach (var kvp in dictionary)
        {
            jObject.Add(kvp.Key.name, kvp.Value == null ? null : JToken.FromObject(kvp.Value));
        }

        jObject.WriteTo(writer);
    }
}

问题是我不知道如何在转换器中引用List&lt;X&gt;。假设 JSON 是线性反序列化的,此时 List&lt;X&gt; 应该已经反序列化了,但是由于 DeserializeObject() 方法还没有完成,所以我没有任何参考。

我将如何解决这个问题?

【问题讨论】:

  • 不知道你说的“转换器内的列表”是什么意思,你是说jObject吗?
  • 我认为需要 property.Value 中的对象类型
  • @derloopkat 被反序列化的根对象由DeserializeObject 接收。在该类中是 List 和 Dictionary。问题是当它反序列化字典时,我无法访问列表。
  • 内部,我的意思是“在转换期间”。

标签: c# json serialization


【解决方案1】:

我最终的解决方案是改变我存储“X”的方式。 我没有将字典的键存储为 json 中的键,而是将每个键值对存储为一个数组项。

然后每个项目是:{ "key": { "$ref" : 5 } "value": { "$ref" : 10 } }

对于写作,这只是使用JArrayJObjectJToken.FromObject的问题(确保传入序列化程序。

对于阅读,jObject.GetValue("Key").ToObject&lt;X&gt;(serializer) 工作出色。

希望这对某人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-12
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多