2011-01-06 88 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或任何类似(功能更强大)的库在运行时生成具有适当结构的新类的解串器,然后实例化并填充该类。

相关问题