Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有一种方法可以在不知道对象结构的情况下从JSON合成匿名类型的对象?_C#_Json_.net 3.5 - Fatal编程技术网

C# 有没有一种方法可以在不知道对象结构的情况下从JSON合成匿名类型的对象?

C# 有没有一种方法可以在不知道对象结构的情况下从JSON合成匿名类型的对象?,c#,json,.net-3.5,C#,Json,.net 3.5,我有一个JSON字符串,我想用它来组成一个对象。我还不知道对象结构或属性,因此无法使用匿名类型对结构进行编码。在这个项目上,我被困在.NET3.5中,所以我还没有访问新的.NET4.0功能。我的目标是在类似WebForms、Spark或Razor的模板引擎中使用转换后的对象,用模型中的值填充文档中的模板项 我尝试过JavaScriptSerializer,它有一个反序列化对象方法,但它输出一个键/值字典,而不是一个类似于JSON对象的对象。还有其他想法吗 如果有帮助的话,下面是一个单元测试,它表

我有一个JSON字符串,我想用它来组成一个对象。我还不知道对象结构或属性,因此无法使用匿名类型对结构进行编码。在这个项目上,我被困在.NET3.5中,所以我还没有访问新的.NET4.0功能。我的目标是在类似WebForms、Spark或Razor的模板引擎中使用转换后的对象,用模型中的值填充文档中的模板项

我尝试过JavaScriptSerializer,它有一个反序列化对象方法,但它输出一个键/值字典,而不是一个类似于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转换为键/值对字典

不能创建这样的匿名类型,但可以发出一个新类

匿名类型仅对您匿名。编译器为所有匿名类型生成一个实际类型,并且在运行时有一个与匿名类型关联的实类型。这些类型不会在运行时生成


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

不能创建这样的匿名类型,但可以发出一个新类

匿名类型仅对您匿名。编译器为所有匿名类型生成一个实际类型,并且在运行时有一个与匿名类型关联的实类型。这些类型不会在运行时生成


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

您可能会在Json.NET中找到以下帮助:

Json.NET是一种流行的.NET高性能Json框架


您可能会在Json.NET中找到以下帮助:

Json.NET是一种流行的.NET高性能Json框架


我不确定我是否理解这将如何运作。模板引擎是否使用反射来访问反序列化对象的字段?这是您正在编写的模板引擎还是其他东西?是的,模板引擎使用反射查找所有属性。然后它迭代属性并用属性的值替换相应的模板项。模板引擎是否使用反射来访问反序列化对象的字段?这是您正在编写的模板引擎还是其他东西?是的,模板引擎使用反射查找所有属性。然后它迭代属性并用属性值替换相应的模板项。