PHP返回JSON如何保留纯数字字符串类型适配.NET反序列化
.NET 6 对接 PHP 7 API 反序列化类型不匹配解决方案
问题根因
两端类型处理逻辑不匹配:
- PHP端
json_encode的JSON_NUMERIC_CHECK是全局规则,只要识别到字符串内容为合法数字就会自动转成数值类型,不会区分字段本身的业务类型定义;如果不加该参数,所有从MySQL读取的字段默认都会被转成字符串类型输出。 - .NET 6默认使用的
System.Text.Json反序列化是严格类型匹配规则,不会自动做跨类型隐式转换,只要JSON字段类型和C#类定义的属性类型不一致就会抛出异常。
方案1:PHP端精准控制输出类型(优先推荐)
不要依赖全局的JSON_NUMERIC_CHECK做类型处理,在数据输出前手动对每个字段做明确类型 cast,从根源保证输出JSON的类型和接口约定完全一致,不需要任何hack逻辑。
示例代码:
// 从MySQL查询得到结果集$resultArray后,先遍历做类型格式化 $formattedResult = array_map(function($item) { return [ 'id' => (int)$item['id'], // 明确指定为整型 'name' => (string)$item['name'],// 明确指定为字符串,无论内容是否为纯数字 'score' => (float)$item['score']// 明确指定为浮点型 ]; }, $resultArray); // 格式化后直接编码输出即可,不需要传入JSON_NUMERIC_CHECK $response = new Response(json_encode($formattedResult));
该方案完全符合API契约优先的设计原则,输出类型100%可控,不会出现纯数字字符串被误转成数值、大整数精度丢失等问题,也不需要修改.NET端的默认反序列化配置。
方案2:.NET端配置宽松反序列化规则(兼容方案)
如果暂时无法调整PHP端逻辑,可以修改.NET端反序列化配置,允许合法的跨类型自动转换,兼容两种格式的JSON输出。
- 首先添加一个极简的通用字符串转换器,支持将JSON中的数值、布尔类型自动转成字符串:
public class FlexStringConverter : JsonConverter<string> { public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { return reader.TokenType switch { JsonTokenType.Number => reader.GetDecimal().ToString(), JsonTokenType.True => bool.TrueString, JsonTokenType.False => bool.FalseString, _ => reader.GetString() }; } public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options) { writer.WriteStringValue(value); } }
- 配置自定义
JsonSerializerOptions,开启数字字符串转数值的支持,注册上述字符串转换器:
var apiJsonOptions = new JsonSerializerOptions { NumberHandling = JsonNumberHandling.AllowReadingFromString, PropertyNameCaseInsensitive = true }; apiJsonOptions.Converters.Add(new FlexStringConverter());
- 修改反序列化代码,传入自定义配置:
return await response.Content.ReadFromJsonAsync<List<MyClass>>(apiJsonOptions);
该配置可以同时兼容两种PHP输出格式:既支持全字符串格式的JSON字段自动转成int/float,也支持纯数字的name字段自动转成字符串,不需要修改业务模型定义。
注意事项
不建议在接口输出中依赖
JSON_NUMERIC_CHECK做全局类型转换,该选项无法感知业务字段的预期类型,除了会误转纯数字字符串字段外,还可能导致手机号、身份证号等超过数值精度范围的长数字字段出现精度丢失问题。
内容的提问来源于stack exchange,提问作者OriginalBigBri
相关产品推荐
相关产品推荐

