2011-11-16 1 views
0

JavaScriptSerializer (이 시점에서 다른 라이브러리를 사용하고 싶지는 않습니다) 방법이 있습니까? test - JavaScriptSerializer를 JavaScript 문자열 또는 배열에서 .NET 문자열 []에 역 직렬화

class Model 
{ 
    string[] Values { get; set; } 
} 

// using the serializer 

JavaScriptSerializer serializer = new JavaScriptSerializer(); 

// this works 
Model workingModel = serializer.Deserialize<Model>("{ Values : ['1234', '2346'] }"); 

// this works 
Model wontWorkModel = serializer.Deserialize<Model>("{ Values : 'test' }"); 

나는 1 개 항목을 배열로 wontWorkModel.Values를 원한다.

내가 지정한 JSON으로 가능합니까?

편집

나는 TypeConverter을 사용하고 string[]의 종류에 삽입이 해킹 할 수 있었다, 그러나 (내가 .NET에 있다고 할 수있는 무서운) 매우 hackish 보인다.

+0

나는 정확히이 문제를 해결하고,이 TypeConverter를 찾으러가는 것이 정확히 맞는 해결책 인 것처럼 느낍니다.)이 모든 것을 이렇게 할 수있는 것은 아닙니다. 여러분의 작은 우주 만 ~ 그러나 코드 샘플은 물론 멋질 것입니다. : D –

답변

0

왜 단순히 그래서 JavascriptConverter을 생성하는 것입니다

Model wontWorkModel = serializer.Deserialize<Model>("{ Values : ['test'] }"); 
+0

나는 그 배열이 보장되지는 않을 것이다. 일부 JavaScript 프레임 워크는 현명하고 자동으로 배열로 승격됩니다. –

+0

mm 모델에 배열이 있으므로 다른 객체로 직렬화해야합니다. '['가 있으면 그것을 가지고, ModelWithArray로 deserialize하고, ModelWithString로 deserialize하면, 찾고있는 것이 아닌 것입니다. 그러나 나는 익명의 객체 또는 그와 비슷한 것을 deserialize 할 방법이 없다고 생각한다. –

1

하나의 옵션을 사용

public class ModelConverter : JavaScriptConverter 
    { 
     public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer) 
     { 
      if (dictionary == null) 
       throw new ArgumentNullException("dictionary"); 

      if (type == typeof(Model)) 
      { 
       Model result = new Model(); 
       foreach (var item in dictionary.Keys) 
       { 
        if (dictionary[item] is string && item == "Values") 
         result.Values = new string[] { (string)dictionary[item] }; 
        else if(item=="Values") 
         result.Values = (string[])((ArrayList)dictionary[item]).ToArray(typeof(string)); 

       } 
       return result; 
      } 
      return null; 
     } 

     public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer) 
     { 
      throw new NotImplementedException(); 
     } 

     public override IEnumerable<Type> SupportedTypes 
     { 
      get { return new ReadOnlyCollection<Type>(new List<Type>(new Type[] { typeof(Model) })); } 
     } 
    } 

당신은 다음과 같이 호출 할 수 있습니다

다음
JavaScriptSerializer serializer = new JavaScriptSerializer(); 

ModelConverter sc = new ModelConverter(); 
serializer.RegisterConverters(new JavaScriptConverter[] { new ModelConverter() }); 


Model workingModel = serializer.Deserialize<Model>("{ Values : '2346' }"); 
Model workingModel1 = serializer.Deserialize<Model>("{ Values : ['2346'] }"); 
Model workingModel2 = serializer.Deserialize<Model>("{ Values : ['2346','3123'] }"); 

MSDN documentation for JavascriptConverter입니다

+0

나는 이것이 일반적인 의미로 작동하기를 바란다. –