C# 使用System.Text.Json展平对象

C# 使用System.Text.Json展平对象,c#,json,system.text.json,C#,Json,System.text.json,我有一个类似这样的类: public class Resource<TState> { public TState State { get; set; } } { "prop1": "foo", "prop2": "bar" } 但是,我需要JSON如下所示: public class Resource<TState> { public TState Sta

我有一个类似这样的类:

public class Resource<TState>
{
    public TState State { get; set; }
}
{
    "prop1": "foo",
    "prop2": "bar"
}
但是,我需要JSON如下所示:

public class Resource<TState>
{
    public TState State { get; set; }
}
{
    "prop1": "foo",
    "prop2": "bar"
}
我需要这个来进行序列化和反序列化。
有没有一种方法可以使用System.Text.Json来实现这一点?

我认为这是可行的:

string jsonString = JsonSerializer.Serialize(a.State);
var state=JsonSerializer.Deserialize(jsonString);
var b=新资源
{
状态=状态
};

如果无法直接序列化/反序列化State属性,则可以实现一个通用JsonConverter,必须为TState使用的每种可能类型安装该JsonConverter,并将其添加到JsonSerializerOptions对象中。显然,只有当您知道将为TState使用什么类型时,才有效

public class Resource<TState>
{
    public TState State { get; set; }
}

public class ResourceJsonConverter<TState> : JsonConverter<Resource<TState>>
{
    public override Resource<TState> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        => new Resource<TState>()
        {
            State = JsonSerializer.Deserialize<TState>(ref reader, options)
        };


    public override void Write(Utf8JsonWriter writer, Resource<TState> value, JsonSerializerOptions options)
        => JsonSerializer.Serialize<TState>(writer, value.State, options);
}

[Fact]
public void Convert()
{
    var r = new Resource<string> { State = "test" };

    var options = new JsonSerializerOptions();
    options.Converters.Add(new ResourceJsonConverter<string>());

    JsonSerializer.Serialize(r, options).Should().Be("test");
}
公共类资源
{
公共TState状态{get;set;}
}
公共类资源JsonConverter:JsonConverter
{
公共覆盖资源读取(参考Utf8JsonReader reader,键入typeToConvert,JsonSerializerOptions选项)
=>新资源()
{
State=JsonSerializer.Deserialize(参考读取器,选项)
};
公共重写无效写入(Utf8JsonWriter编写器、资源值、JsonSerializerOptions选项)
=>JsonSerializer.Serialize(writer、value.State、options);
}
[事实]
公共void Convert()
{
var r=新资源{State=“test”};
var options=新的JsonSerializerOptions();
options.converter.Add(新资源JSONConverter());
序列化(r,options).Should().Be(“测试”);
}

为什么不序列化
State
属性?实现所需行为的代码在哪里?您可以实现一个通用JsonConverter,它必须为TState可能使用的每种类型安装—实际上,您可以使用创建一个工厂,为每种类型生产一个特定的转换器
资源
按需遇到。