2011-01-06 90 views
1

我有一個JSON字符串,我想用來組成一個對象。我不知道對象結構或屬性,所以我不能使用匿名類型對結構進行編碼。我在這個項目中被困在.NET 3.5中,所以我還沒有訪問新的.Net 4.0功能。我的目標是在類似於WebForms,Spark或Razor的模板引擎中使用轉換後的對象來使用模型中的值填充文檔中的模板項目。有沒有辦法在不知道對象的結構的情況下從JSON組成匿名類型對象?

我試過JavaScriptSerializer,它有一個DeserializeObject方法,但它輸出一個鍵/值字典而不是類似於JSON對象的對象。任何其他想法?

如果有幫助,這裏有一個單元測試,表達我想要做的事:

[TestClass] 
    public class when_deserializing_json_to_an_object : given_a_json_serializer_context 
    { 
     private object _expectedSerializedObject; 
     private string _jsonStringToDeserialize; 
     private object _result; 

     protected override void Context() 
     { 
      base.Context(); 

      _expectedSerializedObject = new 
              { 
               Test = "123" 
              }; 

      _jsonStringToDeserialize = "{\"Test\":\"123\"}"; 
     } 

     protected override void BecauseOf() 
     { 
      _result = ObjectConverter.Deserialize(_jsonStringToDeserialize); 
     } 

     [TestMethod] 
     public void it_should_return_the_expected_object() 
     { 
      var modelType = _result.GetType(); 
      var modelProperties = modelType.GetProperties(); 
      var testProperty = modelProperties.SingleOrDefault(x => x.Name == "Test"); 

      testProperty.GetValue(_result, null).ShouldEqual("123");    
     } 
    } 

public abstract class given_a_json_serializer_context : SpecificationBase 
    { 
     protected IObjectConverter ObjectConverter; 
     private JavaScriptSerializer _javascriptSerializer; 

     protected override void Context() 
     { 
      _javascriptSerializer = new JavaScriptSerializer(); 
      ObjectConverter = new JsonObjectConverter(_javascriptSerializer) as IObjectConverter; 
     } 
    } 

(SpecificationBase是,我們的團隊使用,以幫助我們在MSTest的BDD樣式規範類)

到目前爲止,脫胎於規範的生產上面的代碼如下:

public class JsonObjectConverter : IObjectConverter 
{ 
    private readonly JavaScriptSerializer _javascriptSerializer; 

    public JsonObjectConverter(JavaScriptSerializer javascriptSerializer) 
    { 
     _javascriptSerializer = javascriptSerializer; 
    } 

    public object Deserialize(string json) 
    { 
     return _javascriptSerializer.DeserializeObject(json); 
    } 
} 

在這一點上,很明顯的是,JavaScriptSerializer是不會做這個技巧,因爲它只是將JSON轉換爲鍵/值對字典。

+0

我不知道我知道如何這是行得通的。您的模板引擎是否使用反射來訪問反序列化的對象的字段?這是你正在寫的模板引擎還是其他的東西? – 2011-01-06 20:42:42

回答

6

您不能像這樣創建一個匿名類型,但可以發出一個新類。

匿名類型只對您匿名。編譯器爲所有匿名類型生成實際類型,並且在運行時存在與匿名類型關聯的實際類型。這些類型不是在運行時生成的。

但是,您可以創建使用Reflection.Emit或任何類似(功能更強大)的庫在運行時生成具有適當結構的新類的解串器,然後實例化並填充該類。

相關問題