gpt4 book ai didi

c# - 将 false 反序列化为 null (System.Text.Json)

转载 作者:行者123 更新时间:2023-12-02 00:11:25 26 4
gpt4 key购买 nike

我正在使用一个 API,由于某种原因,它在应该使用 null 的地方使用了 false。我不知道如何正确反序列化它。我尝试创建一个自定义 JsonConverter 来解决此问题,但无法做到这一点。我想避免使用动态类型。我应该如何反序列化它?

这是默认响应。

{
"products": [
{
"id": 123456789,
"supplier": {
"id": 123456,
"title": "abc"
}
}
]
}

我正在反序列化如下。

public class Container
{
public Product[] products { get; set; }
}

public class Product
{
public ulong id { get; set; }
public Supplier supplier { get; set; }
}

public class Supplier
{
public ulong id { get; set; }
public string title { get; set; }
}

JsonSerializer.Deserialize<Container>(json)

这是当产品没有供应商时的响应。

{
"products": [
{
"id": 123456789,
"supplier": false
}
]
}

最佳答案

您可以为 supplier 属性创建自定义 JsonConverter:

public class Product
{
public ulong id { get; set; }

[JsonConverter(typeof(SupplierConverter))]
public Supplier supplier { get; set; }
}

public class SupplierConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Boolean)
{
if ((bool)reader.Value == false)
return null;
}

return serializer.Deserialize(reader, objectType);
}

public override bool CanConvert(Type objectType)
{
return false;
}
}

更新:

如果您使用的是System.Text.Json,您可以尝试以下自定义转换器:

public class SupplierConverter : JsonConverter<Supplier>
{
public override Supplier Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType == JsonTokenType.False)
return null;

if (options.GetConverter(typeof(JsonElement)) is JsonConverter<JsonElement> converter)
{
var json = converter.Read(ref reader, typeToConvert, options).GetRawText();

return JsonSerializer.Deserialize<Supplier>(json);
}

throw new JsonException();
}

public override void Write(Utf8JsonWriter writer, Supplier value, JsonSerializerOptions options)
{
throw new NotImplementedException();
}
}

关于c# - 将 false 反序列化为 null (System.Text.Json),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60634410/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com