C# 使用System.Text.JSON将JSON反序列化为包含动态属性的类

C# 使用System.Text.JSON将JSON反序列化为包含动态属性的类,c#,json,.net-core-3.0,system.text.json,C#,Json,.net Core 3.0,System.text.json,目标是使用netcore3中新的System.Text.JSON库,将JSON响应反序列化到包含动态部分的包装器响应类 就是 { "fixedProperty": "Hello", "dynamicProperty": { "attributeOne": "One", "attributeTwo": "Two", } } 到 响应中动态属性的类型总是预先知道的(取决于请求),并且是三个不同类中的一个 除了没有一个具有动态属性的包装器类,

目标是使用netcore3中新的System.Text.JSON库,将JSON响应反序列化到包含动态部分的包装器响应类

就是

{
    "fixedProperty": "Hello",
    "dynamicProperty": { 
        "attributeOne": "One",
        "attributeTwo": "Two",
    }
}

响应中动态属性的类型总是预先知道的(取决于请求),并且是三个不同类中的一个

除了没有一个具有动态属性的包装器类,而是每个案例都有多个不同的响应类(这显然很好,但不是理想的解决方案)之外,无法找到一种干净的方法来实现这一点

编辑:
解决方案是使用通用的。

像这样的东西怎么样

var myResponseClass=new myResponseClass();
动态myClass=JsonSerializer.Deserialize({“fixedProperty\”:“Hello\”,“dynamicProperty\”:{“attributeOne\”:“One\”,“AttributeTo\”:“Two\”});
dynamic myProperty=JsonSerializer.Deserialize(myClass.dynamicProperty.ToString());
myResponseClass.FixedProperty=myClass.FixedProperty.ToString();
myResponseClass.DynamicProperty=myProperty;
由于响应中的动态属性类型总是预先知道的(取决于请求),因此可以使用根对象:

public class MyResponseClass<T> 
{ 
    public string FixedProperty { get; set; } 
    public T DynamicProperty { get; set; } 
}

如果JSON是不可预测的,那么它有什么意义呢?无论如何,您可以在一个类中拥有所有可能的属性,然后根据这些属性进行处理,例如。。。。此外,如果您控制着JSON,那么您可能应该为您的模型定义一个更好的策略,并让特定的api操作返回特定的JSON模型。如果您更好地解释应用程序的功能以及您的最终目标,那么我们可以试着找出一种更好的方法来实现您的需求,我正在使用一个我无法控制的API。当然,该API的所有响应都是可预测的。所有响应都具有相同的外部结构和每个端点不同的数据属性。这是我尝试将反应的公共部分分解为一个练习,我在自学c。正如我所说的,为每个响应创建一个单独的模型非常好,但我正在寻找一种方法来分解公共外壳。既然您总是事先知道
dynamicProperty
的类型,为什么不使用泛型呢<代码>公共类MyResponseClass{public string FixedProperty{get;set;}public T DynamicProperty{get;set;}}是的,如果它起作用,这将非常适合我的情况。出于某种原因,如果以这种方式反序列化,DynamicProperty将保持为空,我不明白为什么。是否支持反序列化为泛型类型?感谢您的回复!虽然使用泛型类型更适合我的场景,但这实际上回答了我想问的另一个问题!谢谢
public class MyResponseClass<T> 
{ 
    public string FixedProperty { get; set; } 
    public T DynamicProperty { get; set; } 
}
var root = JsonSerializer.Deserialize<MyResponseClass<MyDataClassOne>>(responseString);
var fixedProperty = root.fixedProperty;
var attributeOne = root.DynamicProperty?.AttributeOne;