2013-04-18 5 views
8

içinde çağırarak arayın Okuma/yazma işleminde gerçekleştirmem gereken bazı dönüştürme görevlerini gerçekleştirmek için JsonConverter yazıyorum. Özellikle, var olan serileştirme davranışını alıyorum ve okumadaki bu ek özellikleri yazma/okuma konusunda bazı ek özellikler üzerinde duruyorum.JsonSerializer'ı JsonConverter

JsonConverter içinde, dönüşüm işlevinin çoğunu gerçekleştirmek için iletilen JsonSerializer örneğinden yararlanmak istiyorum. Bununla birlikte, bunu yaptığımda, dönüştürücüye çeviriciye çağrı yapan dönüştürücüyü aradığı bir özyinelemeli döngü içinde son bulurum. Bu, dönüştürücüye ve benzerine çağrı yapan seri hale getiriciyi çağırır.

Kullanıcıların, JsonConvert.SerializeObject kullanımı gibi şeyler yaptığını gördüm,this hariç, tüm dönüştürücüler seri hale getirici örneğinden geçirilir. Ancak, bu benim için çalışmaz çünkü özel sözleşme çözümleyici ve DateTime işleme gibi benim serileştirici üzerinde yaptığım diğer tüm özelleştirmeleri atlar.

bir yol Ben Ya var mı:

  1. Kullanım serileştirici örneği bana geçti, ama bir şekilde benim dönüştürücü dışlamak veya
  2. Klon bana geçirilen seri hale getirici (el yenisini inşa etmeden ve mülkiyeti mülkiyete kopyalama) ve dönüştürücüyü kaldır

cevap

0

Bu çok yaygın bir sorundur. "JsonConvert.SerializeObject" kullanımı kötü bir fikir değildir. Bununla birlikte, bazı durumlarda (tipik olarak koleksiyonlar) kullanılabilecek bir numara, okurken, basit bir türevi yazarken ve yeniden serileştirirken arayüze yayın yapmaktır. Aşağıda

Not "WriteJson" IDictionary < K atmalarını (:) burada yaşımı gösteriliyor) yerine bir nesne gibi bakarak daha KVPs kümesi olarak tefrika edilmiş olabilir sözlükleri ile ilgilenen basit bir dönüştürücü , V> ve "ReadJson", "DummyDictionary" kullanır. Doğru olanla son buluyorsunuz ama yinelenen soruna neden olmadan geçirilen seri hale getiriciyi kullanıyorsunuz.

/// <summary> 
/// Converts a <see cref="KeyValuePair{TKey,TValue}"/> to and from JSON. 
/// </summary> 
public class DictionaryAsKVPConverter<TKey, TValue> : JsonConverter 
{ 
    /// <summary> 
    /// Determines whether this instance can convert the specified object type. 
    /// </summary> 
    /// <param name="objectType">Type of the object.</param> 
    /// <returns> 
    ///  <c>true</c> if this instance can convert the specified object type; otherwise, <c>false</c>. 
    /// </returns> 
    public override bool CanConvert(Type objectType) 
    { 
     if (!objectType.IsValueType && objectType.IsGenericType) 
      return (objectType.GetGenericTypeDefinition() == typeof(Dictionary<,>)); 

     return false; 
    } 

    /// <summary> 
    /// Writes the JSON representation of the object. 
    /// </summary> 
    /// <param name="writer">The <see cref="JsonWriter"/> to write to.</param> 
    /// <param name="value">The value.</param> 
    /// <param name="serializer">The calling serializer.</param> 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     var dictionary = value as IDictionary<TKey, TValue>; 
     serializer.Serialize(writer, dictionary); 
    } 

    /// <summary> 
    /// Reads the JSON representation of the object. 
    /// </summary> 
    /// <param name="reader">The <see cref="JsonReader"/> to read from.</param> 
    /// <param name="objectType">Type of the object.</param> 
    /// <param name="existingValue">The existing value of object being read.</param> 
    /// <param name="serializer">The calling serializer.</param> 
    /// <returns>The object value.</returns> 
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     Dictionary<TKey, TValue> dictionary; 

     if (reader.TokenType == JsonToken.StartArray) 
     { 
      dictionary = new Dictionary<TKey, TValue>(); 
      reader.Read(); 
      while (reader.TokenType == JsonToken.StartObject) 
      { 
       var kvp = serializer.Deserialize<KeyValuePair<TKey, TValue>>(reader); 
       dictionary[kvp.Key] = kvp.Value; 
       reader.Read(); 
      } 
     } 
     else if (reader.TokenType == JsonToken.StartObject) 
      // Use DummyDictionary to fool JsonSerializer into not using this converter recursively 
      dictionary = serializer.Deserialize<DummyDictionary>(reader); 
     else 
      dictionary = new Dictionary<TKey, TValue>(); 

     return dictionary; 
    } 

    /// <summary> 
    /// Dummy to fool JsonSerializer into not using this converter recursively 
    /// </summary> 
    private class DummyDictionary : Dictionary<TKey, TValue> { } 
} 
-3

Üzgünüz, ama belki kafam karışıyor. Benim nesneleri seri için bu yöntemleri kullandı:

using System; 
 
using Newtonsoft.Json; 
 

 
namespace Utilities 
 
{ 
 
    public static class serializer 
 
    { 
 
     public static string SerializeObject(object objectModel) { 
 
      return JsonConvert.SerializeObject(objectModel); 
 
     } 
 
     public static object DeserializeObject<T>(string jsonObject) 
 
     { 
 
      try 
 
      { 
 
       return JsonConvert.DeserializeObject<T>(jsonObject); 
 
      } 
 
      catch (Exception ex) { return null; } 
 
      
 
     } 
 
    } 
 
}

ve bu kodun kullandı:

userLoged = (modelUser)serializer.DeserializeObject<modelUser>((string)Session["userLoged"]);

Bu yardımcı olmuştur umarım.

+1

Bu, sorulan soruya yanıt vermiyor. Soru "Nesnemi JsonConvert kullanarak nasıl seri hale getirebilirim?" Özel bir 'JsonConverter' içerisinden özyinelemeli bir döngüden nasıl kaçınıldığını soruyordu. ['JsonConvert'] 'un (http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_JsonConvert.htm) ve [JsonConverter'] olduğunu unutmayın (http://www.newtonsoft.com/json/help/html /T_Newtonsoft_Json_JsonConverter.htm), Json.Net'te tamamen farklı iki sınıftır. –