我有一个JSON字符串,我想用它来组成一个对象.我还不知道对象结构或属性,所以我不能使用匿名类型编码结构.我在这个项目上遇到了.NET 3.5,所以我还没有访问新的.Net 4.0功能.我的目标是在类似于WebForms,Spark或Razor的模板引擎中使用转换后的对象,以使用模型中的值填充文档中的模板项.
我尝试过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;
}
}
Run Code Online (Sandbox Code Playgroud)
(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);
}
}
Run Code Online (Sandbox Code Playgroud)
在这一点上,很明显JavaScriptSerializer不会这样做,因为它只是将JSON转换为键/值对字典.
您无法像这样创建匿名类型,但可以发出新类.
匿名类型只对您来说是匿名的.编译器为所有匿名类型生成实际类型,并且在运行时有一个与匿名类型相关联的实际类型.这些类型不是在运行时生成的.
但是,您可以创建一个使用Reflection.Emit或任何类似(更强大)库的反序列化器,以在运行时生成具有适当结构的新类,然后实例化并填充该类.