C# 有没有一种方法可以在不知道对象结构的情况下从JSON合成匿名类型的对象?
我有一个JSON字符串,我想用它来组成一个对象。我还不知道对象结构或属性,因此无法使用匿名类型对结构进行编码。在这个项目上,我被困在.NET3.5中,所以我还没有访问新的.NET4.0功能。我的目标是在类似WebForms、Spark或Razor的模板引擎中使用转换后的对象,用模型中的值填充文档中的模板项 我尝试过JavaScriptSerializer,它有一个反序列化对象方法,但它输出一个键/值字典,而不是一个类似于JSON对象的对象。还有其他想法吗 如果有帮助的话,下面是一个单元测试,它表达了我试图做的事情:C# 有没有一种方法可以在不知道对象结构的情况下从JSON合成匿名类型的对象?,c#,json,.net-3.5,C#,Json,.net 3.5,我有一个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框架
我不确定我是否理解这将如何运作。模板引擎是否使用反射来访问反序列化对象的字段?这是您正在编写的模板引擎还是其他东西?是的,模板引擎使用反射查找所有属性。然后它迭代属性并用属性的值替换相应的模板项。模板引擎是否使用反射来访问反序列化对象的字段?这是您正在编写的模板引擎还是其他东西?是的,模板引擎使用反射查找所有属性。然后它迭代属性并用属性值替换相应的模板项。