2012-11-07 23 views
5

प्रोजेक्ट में मैं काम कर रहा हूं, हमने Json.Net लाइब्रेरी का उपयोग करना शुरू कर दिया।Json.net ढीले बनाम सख्त प्रकार deserialization

हालांकि, मुझे पता चला कि json.net स्ट्रिंग प्रकार पर 'ढीला' है।

डीटीओ वर्ग

[JsonObject] 
public class DTO 
{ 
    [JsonProperty] 
    public string type; 
} 

अक्रमांकन

byte[] rawBody = GetBytes(@"{""type"":true}"); 
using (MemoryStream ms = new MemoryStream(rawBody)) 
{ 
    using (StreamReader sr = new StreamReader(ms)) 
    { 
     var serializer = new JsonSerializer(); 

     return serializer.Deserialize(sr, typeof(DTO)); 
    } 
} 

इस 'प्रकार' deserialize के रूप में "सही" विशेषता:

यहाँ एक उदाहरण है। हालांकि, मैं उम्मीद करता हूं कि यह असफल हो जाए और अपवाद फेंक दें क्योंकि एक प्रकार का मेल नहीं है। यह वही करता है यदि मैं जेसन में 1 से सही बदलता हूं। संपत्ति 'प्रकार' मान "1" होगा।

सवाल:

  1. वहाँ सख्त क्रमबद्धता लागू करने के लिए कोई तरीका है?

  2. क्या स्ट्रिंग की तुलना में अन्य प्रकार हैं जिनके पास निहित रूपांतरण है जैसे हम यहां देखते हैं?

धन्यवाद।

जेएफ

उत्तर

1

मैं एक कामकाज के साथ आया था।

हालांकि यह काम करता है, मुझे नहीं पता कि यह मेरी 'समस्या' को हल करने का एक अच्छा तरीका है या नहीं।

मैं कन्वर्टर्स इस्तेमाल किया से

यहाँ कन्वर्ट करने के लिए है मैं क्या किया:

[JsonObject] 
public class DTO 
{ 
    [JsonProperty] 
    public string type; 
} 

कस्टम कनवर्टर:

class JsonStrictConverter<T> : JsonConverter 
    { 
     public JsonToken[] TokenTypes { get; set; } 

     public JsonStrictConverter(params JsonToken[] tokenTypes) 
     { 
      TokenTypes = tokenTypes; 
     } 

     public override bool CanConvert(Type objectType) 
     { 
      return objectType == typeof(T); 
     } 
     public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
     { 
      if (reader.TokenType == JsonToken.Null) 
      { 
       if (objectType.IsValueType) 
       { 
        return Activator.CreateInstance(objectType); 
       } 
       return null; 
      } 

      var converter = System.ComponentModel.TypeDescriptor.GetConverter(typeof(T)); 
      return (T)converter.ConvertFromString(reader.Value.ToString()); 
     } 
     public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
     { 
      throw new NotImplementedException("The converter '" + this.GetType().Name + "' is not intended to be used when serializing."); 
     } 
     public override bool CanWrite { get { return false; } } 
    } 

अक्रमांकन:

XmlDictionaryReader bodyReader = message.GetReaderAtBodyContents(); 
bodyReader.ReadStartElement("Binary"); 
byte[] rawBody = bodyReader.ReadContentAsBase64(); 
using (MemoryStream ms = new MemoryStream(rawBody)) 
{ 
    using (StreamReader sr = new StreamReader(ms)) 
    { 
     var serializer = new JsonSerializer(); 
     /* These converter are present to enforce strict data type in the json. */ 
     /* by default, newtonsoft can serialize Numbers as strings, strings as boolean, etc.... */ 
     serializer.Converters.Add(new JsonStrictConverter<string>(JsonToken.String)); 
     serializer.Converters.Add(new JsonStrictConverter<bool>(JsonToken.Boolean)); 
     serializer.Converters.Add(new JsonStrictConverter<short>(JsonToken.Integer)); 
     serializer.Converters.Add(new JsonStrictConverter<ushort>(JsonToken.Integer)); 
     serializer.Converters.Add(new JsonStrictConverter<int>(JsonToken.Integer)); 
     serializer.Converters.Add(new JsonStrictConverter<uint>(JsonToken.Integer)); 
     serializer.Converters.Add(new JsonStrictConverter<long>(JsonToken.Integer)); 
     serializer.Converters.Add(new JsonStrictConverter<ulong>(JsonToken.Integer)); 
     serializer.Converters.Add(new JsonStrictConverter<float>(JsonToken.Float, JsonToken.Integer)); 
     serializer.Converters.Add(new JsonStrictConverter<double>(JsonToken.Float, JsonToken.Integer)); 
     serializer.Converters.Add(new JsonStrictConverter<decimal>(JsonToken.Float, JsonToken.Integer)); 

     return serializer.Deserialize(sr, typeof(DTO));      
    } 
} 

वहाँ किसी भी है Ty इस दृष्टिकोण में लापता है?

क्या किसी के पास बेहतर समाधान है?

धन्यवाद।

1

सोचें कि json.net सख्त प्रकार क्रमबद्धता को संभालता है, साथ ही यह .net जेसन सीरियलाइज़र से बहुत तेज है। http://json.codeplex.com