【问题标题】:Unexpected character encountered while parsing value line 1, position 1解析值第 1 行,位置 1 时遇到意外字符
【发布时间】:2020-11-26 12:08:55
【问题描述】:

我正在构建 .Net Core 3.1 Web API。向 Web API 发送请求。我正在使用 System.Net.Http 库。我将 JSON 放入 POST 请求正文中。这是 Web API 端处理程序:

using Microsoft.AspNetCore.Mvc;
[ApiController]
public class MyController : ControllerBase
{
    [HttpPost]
    public int HandleRequest([FromBody] string jsonString)
    {
        return 1;
    }
}

下面的代码将空的 ArrayList 发送到 Web API,但它总是返回“在解析值第 1 行,位置 1 时遇到意外字符。”。

var serializedData = new JavaScriptSerializer().Serialize(new ArrayList());
var content = new StringContent(serializedData, Encoding.UTF8, "application/json");
var response = client.PostAsync(url, content);
return response.Result.Content.ReadAsStringAsync();

我尝试使用 JsonConvert 并围绕对象进行序列化,但它总是返回相同的错误。但是后来我发现,如果我进行两次序列化,它就会开始工作。所以下面的代码可以正常工作 - 发送请求时没有任何错误,并且 Web API 端的数据是正确的。

var serializer = new JavaScriptSerializer();
var serializedData = serializer.Serialize(serializer.Serialize(new ArrayList()));
var content = new StringContent(serializedData, Encoding.UTF8, "application/json");
var response = client.PostAsync(url, content);
return response.Result.Content.ReadAsStringAsync();

为什么我需要进行双重序列化才能使其工作?

【问题讨论】:

  • JavaScriptSerializerArrayList 不推荐使用
  • ?这两个 sn-ps 之间的唯一区别似乎是您将序列化程序存储在第二个本地。正如您所建议的,您不会在这里序列化两次。
  • @500-InternalServerError 他正在序列化两次。首先调用序列化ArrayListstring,然后调用stringstring - 这就是端点工作的原因。
  • [FromBody] string jsonString 替换为[FromBody] ArrayList arrayList 或任何集合。
  • @Hostel:所以他是 - 我现在看到了。

标签: c# asp.net-core asp.net-core-webapi


【解决方案1】:

首先,当你使用异步方法时,你应该添加 await 关键字:

var response = await client.PostAsync(url, content);
return await response.Result.Content.ReadAsStringAsync();

其次,您正在发送一个数组,那么为什么不尝试发送它并作为对象而不是字符串获取:

var updateData = new ArrayList();
var jsonObject = JsonConvert.SerializeObject(updateData);
var content = new StringContent(jsonObject, Encoding.UTF8, "application/json");
var res = await apiClient.PutAsync(url, content);

然后在 WebAPI 中:

[HttpPost]
public int HandleRequest([FromBody] ArrayList list)
{
    return 1;
}

【讨论】:

    【解决方案2】:
    var serializedData = new JavaScriptSerializer().Serialize(new ArrayList());
    Console.WriteLine(serializedData);
    // Output: []
    
    var serializer = new JavaScriptSerializer();
    var serializedData = serializer.Serialize(serializer.Serialize(new ArrayList()));
    Console.WriteLine(serializedData);
    // Output: "[]"
    

    您有一个错误,因为您的端点需要字符串,但在第一次序列化中您正在发送一个数组。 第二次序列化有效,因为首先将ArrayList 序列化为string,然后将string 序列化为string。最后你不小心发送了一个序列化的字符串,端点可以反序列化它。

    错误"Unexpected character encountered while parsing value line 1, position 1." 表示服务器接收到第一个字符[,但它需要",因为它尝试将JSON 反序列化为字符串——但它是数组。

    【讨论】:

      猜你喜欢
      • 2019-12-31
      • 2020-01-15
      • 1970-01-01
      • 2022-11-05
      • 2018-07-25
      • 2015-05-12
      • 1970-01-01
      • 1970-01-01
      • 2022-07-30
      相关资源
      最近更新 更多