簡體   English   中英

C#參考早期的JSON元素-Newtonsoft

[英]C# Reference earlier JSON element - Newtonsoft

我正在序列化具有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<X> 假設JSON是線性反序列化的,那么List<X>應該已經反序列化了,但是由於DeserializeObject()方法尚未完成,因此我對此沒有任何引用。

我將如何解決這個問題?

最后,我的解決方案是更改存儲“ X”的方式。 我沒有將字典的鍵存儲為json中的鍵,而是將每個鍵值對存儲為數組項。

每個項目然后是: { "key": { "$ref" : 5 } "value": { "$ref" : 10 } }

對於編寫,這只是使用JArrayJObjectJToken.FromObject (確保傳遞序列化器。

為了閱讀, jObject.GetValue("Key").ToObject<X>(serializer)表現出色。

希望這對某人有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM