如何修复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
相关产品推荐
相关产品推荐

