using System.Text.Json; using System.Text.Json.Serialization; namespace FoodLabeling.Application.Contracts.Json; /// /// 反序列化时兼容 JSON 字符串或字符串数组(取首个非空元素),用于前端误把单选字段传成数组的场景(如 partnerId)。 /// public sealed class StringOrFirstArrayItemJsonConverter : JsonConverter { public override string? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { switch (reader.TokenType) { case JsonTokenType.Null: return null; case JsonTokenType.String: return reader.GetString(); case JsonTokenType.StartArray: { string? first = null; while (reader.Read()) { if (reader.TokenType == JsonTokenType.EndArray) { break; } if (reader.TokenType == JsonTokenType.Null) { continue; } if (reader.TokenType != JsonTokenType.String) { throw new JsonException("partnerId 数组元素必须是字符串"); } var item = reader.GetString()?.Trim(); if (first is null && !string.IsNullOrWhiteSpace(item)) { first = item; } } return first; } default: throw new JsonException($"无法将 JSON token {reader.TokenType} 转为字符串(partnerId)"); } } public override void Write(Utf8JsonWriter writer, string? value, JsonSerializerOptions options) { if (value is null) { writer.WriteNullValue(); } else { writer.WriteStringValue(value); } } }