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

如何修复Azure Function中HttpRequest JSON反序列化错误?

问题分析与解决方案

核心错误原因

你遇到的"意外字符'{' "错误,本质是请求JSON结构与Cart模型完全不匹配,和Stream转换无关:

  • 请求JSON的字段是testId、shopItems(嵌套对象)
  • 你的Cart模型字段是CartId、CartContents(字符串类型)
    当你尝试把包含嵌套对象的JSON直接反序列化为Cart时,shopItems对应的{无法被解析为字符串类型,自然触发错误。

修复步骤

方案1:调整模型匹配请求结构

如果需要直接映射请求数据,修改Cart模型对应请求字段:

public class Cart
{
    [JsonProperty("testId")] // 匹配请求里的testId字段
    public string CartId { get; set; }
    
    [JsonProperty("shopItems")] // 匹配请求里的shopItems对象
    public ShopItem CartContents { get; set; }
}

public class ShopItem
{
    public string itemName { get; set; }
}

然后反序列化时就可以正常解析:

Cart cart = JsonConvert.DeserializeObject<Cart>(result);

方案2:保留原模型,将请求JSON转为字符串存入CartContents

如果需要把整个请求JSON作为字符串存入CartContents,同时提取testId作为CartId:

public async Task UpdateCartAsync(Stream content)
{
    var result = await new StreamReader(content).ReadToEndAsync();
    
    // 先解析请求JSON获取testId
    var requestObj = JObject.Parse(result);
    var cart = new Cart
    {
        CartId = requestObj["testId"].ToString(),
        CartContents = result // 直接把整个请求JSON作为字符串存入
    };

    var db = _connectionMultiplexer.GetDatabase();
    await db.StringSetAsync(cart.CartId, cart.CartContents);
}

额外注意:Stream读取的小细节

如果后续需要重复读取Stream,记得重置位置(当前场景下不需要,但可作为知识点):

content.Position = 0; // 重置流位置到开头

其他向Azure Function传递JSON的方式

Azure Function提供了更简洁的JSON处理方式,无需手动操作Stream:

方式1:自动绑定到模型

直接在HttpTrigger参数里绑定到请求对应的模型,Function会自动完成JSON反序列化:

[FunctionName("UpdateCart")]
public async Task<IActionResult> UpdateCart(
    [HttpTrigger(AuthorizationLevel.Function, "post", Route = "v1/cart/update")] RequestModel req, // 直接绑定到模型
    ILogger log)
{
    // 直接使用req对象
    await _myService.UpdateCartAsync(req);
    return new OkResult();
}

// 定义请求对应的模型
public class RequestModel
{
    public string testId { get; set; }
    public ShopItem shopItems { get; set; }
}

public class ShopItem
{
    public string itemName { get; set; }
}

然后服务接口可以改为接收RequestModel,不用再处理Stream:

public interface IMyService
{
    Task UpdateCartAsync(RequestModel request);
}

方式2:读取请求内容为字符串

使用await req.ReadAsStringAsync()直接获取JSON字符串,比手动处理Stream更简单:

[FunctionName("UpdateCart")]
public async Task<IActionResult> UpdateCart(
    [HttpTrigger(AuthorizationLevel.Function, "post", Route = "v1/cart/update")] HttpRequest req,
    ILogger log)
{
    var jsonStr = await req.ReadAsStringAsync();
    await _myService.UpdateCartAsync(jsonStr);
    return new OkResult();
}

然后服务里直接使用这个字符串处理即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:24:28