Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.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# 使用System.Text.Json自定义反序列化_C#_.net Core_System.text.json - Fatal编程技术网

C# 使用System.Text.Json自定义反序列化

C# 使用System.Text.Json自定义反序列化,c#,.net-core,system.text.json,C#,.net Core,System.text.json,我的项目中有一个JSON字符串,如:(来自API调用) (我也先搜索,但没有找到与我的情况相符的内容) ” { “财产”:[ { “财产1”:1, “财产2”:正确, “财产3”:[ { “财产3”11, “财产”:“价值”, “财产3”为真 }, { “财产3”1:12, “财产”:“价值”, “property_3_3”:错误 } ] }, { “财产1”:2, “财产2”:假, “财产3”:[ { “财产3”1:21, “财产”:“价值”, “property_3_3”:错误 }, { “

我的项目中有一个JSON字符串,如:(来自API调用) (我也先搜索,但没有找到与我的情况相符的内容)

”
{
“财产”:[
{
“财产1”:1,
“财产2”:正确,
“财产3”:[
{
“财产3”11,
“财产”:“价值”,
“财产3”为真
},
{
“财产3”1:12,
“财产”:“价值”,
“property_3_3”:错误
}
]
},
{
“财产1”:2,
“财产2”:假,
“财产3”:[
{
“财产3”1:21,
“财产”:“价值”,
“property_3_3”:错误
},
{
“财产3 1”:22,
“财产”:“价值”,
“财产3”为真
}
]
}
]
}
"
我需要将其反序列化为以下类的列表:

公共类PropertyTo
{
公共长属性_1{get;set;}
公共布尔属性_2{get;set;}
公共字符串属性_3{get;set;}
}
有没有办法将“property_3”的数组反序列化为字符串? 比如:

var peroperty=newpropertydto();
peroperty.peroperty_3=”
[
{
“财产3”1:21,
“财产”:“价值”,
“property_3_3”:错误
},
{
“财产3”1:12,
“财产”:“价值”,
“property_3_3”:错误
}
]
"

Asp.Net Core 5 | System.Text.Json

您可以通过以下
JsonConverter
实现这一点:

public class PropertyDtoConverter : JsonConverter<PropertyDto>
{
    public override PropertyDto? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        if (reader.TokenType != JsonTokenType.StartObject)
        {
            throw new JsonException();
        }

        var dto = new PropertyDto();
        while (reader.Read())
        {
            if (reader.TokenType == JsonTokenType.EndObject)
            {
                return dto;
            }

            if (reader.TokenType == JsonTokenType.PropertyName)
            {
                string propName = (reader.GetString() ?? "").ToLower();
                reader.Read();

                switch (propName)
                {
                    case var _ when propName.Equals(nameof(PropertyDto.Property_1).ToLower()):
                        dto.Property_1 = reader.GetInt64();
                        break;
                    case var _ when propName.Equals(nameof(PropertyDto.Property_2).ToLower()):
                        dto.Property_2 = reader.GetBoolean();
                        break;
                    case var _ when propName.Equals(nameof(PropertyDto.Property_3).ToLower()):
                        if (JsonDocument.TryParseValue(ref reader, out JsonDocument jsonDoc))
                        {
                            dto.Property_3 = jsonDoc.RootElement.GetRawText();
                        }

                        break;
                }
            }
        }

        throw new JsonException();
    }

    public override void Write(Utf8JsonWriter writer, PropertyDto value, JsonSerializerOptions options)
    {
        writer.WriteStartObject();

        writer.WriteNumber(nameof(PropertyDto.Property_1), value.Property_1);
        writer.WriteBoolean(nameof(PropertyDto.Property_2), value.Property_2);
        writer.WriteString(nameof(PropertyDto.Property_3), value.Property_3);

        writer.WriteEndObject();
    }
}
您可以显式地将字符串转换为
PropertyDto

PropertyDto dto = JsonSerializer.Deserialize<PropertyDto>(dtoString);
如果要反序列化整个
PropertyDto
集合,可以执行以下操作:

public class PropertyCollectionDto
{
    public List<PropertyDto> Property { get; set; } = new();
}

[HttpPost("/collection")]
public void Post(PropertyCollectionDto dto)
{
   ...
}
公共类属性集合到
{
公共列表属性{get;set;}=new();
}
[HttpPost(“/collection”)]
公共作废帖子(PropertyCollectionDto dto)
{
...
}

所以你想直接将它从json反序列化为
字符串[]
?@Dominik我只想将“property_3”反序列化为字符串,而不是C中的相关类结构;我不清楚你打算如何工作。您有“property_1”,它包含一个对象数组,子对象的“property_3”属性也包含一个对象数组,您似乎想以某种方式将其展平到您上面描述的C#模型。你能告诉我们(从人的角度)这应该如何工作吗?而且
Property\u 1Dto
应该是
Property\u 1Dto
的集合还是仅仅一个对象?@seyedarmfatemi您可以为您的用例编写一个自定义转换器:@John结果应该是Property\u 1Dto的集合。我需要将属性_3的内容作为字符串存储在每个itemBrilliant中,谢谢。你帮我节省了很多时间!
[HttpPost]
public void Post(PropertyDto dto)
{
    ...
}
public class PropertyCollectionDto
{
    public List<PropertyDto> Property { get; set; } = new();
}

[HttpPost("/collection")]
public void Post(PropertyCollectionDto dto)
{
   ...
}