有没有办法从JSON编写匿名类型对象而不事先了解对象的结构?

Byr*_*ahl 1 c# json .net-3.5

我有一个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转换为键/值对字典.

Sam*_*eff 6

您无法像这样创建匿名类型,但可以发出新类.

匿名类型只对您来说是匿名的.编译器为所有匿名类型生成实际类型,并且在运行时有一个与匿名类型相关联的实际类型.这些类型不是在运行时生成的.

但是,您可以创建一个使用Reflection.Emit或任何类似(更强大)库的反序列化器,以在运行时生成具有适当结构的新类,然后实例化并填充该类.