You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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输出。

  1. 首先添加一个极简的通用字符串转换器,支持将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);
    }
}
  1. 配置自定义JsonSerializerOptions,开启数字字符串转数值的支持,注册上述字符串转换器:
var apiJsonOptions = new JsonSerializerOptions
{
    NumberHandling = JsonNumberHandling.AllowReadingFromString,
    PropertyNameCaseInsensitive = true
};
apiJsonOptions.Converters.Add(new FlexStringConverter());
  1. 修改反序列化代码,传入自定义配置:
return await response.Content.ReadFromJsonAsync<List<MyClass>>(apiJsonOptions);

该配置可以同时兼容两种PHP输出格式:既支持全字符串格式的JSON字段自动转成int/float,也支持纯数字的name字段自动转成字符串,不需要修改业务模型定义。

注意事项

不建议在接口输出中依赖JSON_NUMERIC_CHECK做全局类型转换,该选项无法感知业务字段的预期类型,除了会误转纯数字字符串字段外,还可能导致手机号、身份证号等超过数值精度范围的长数字字段出现精度丢失问题。

内容的提问来源于stack exchange,提问作者OriginalBigBri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 15:18:15