C# 分析值行1位置1时遇到意外字符
我正在构建.NETCore3.1WebAPI。向Web API发送请求。我正在使用System.Net.Http库。我将JSON放入POST请求主体中。这是Web API端处理程序:C# 分析值行1位置1时遇到意外字符,c#,asp.net-core,asp.net-core-webapi,C#,Asp.net Core,Asp.net Core Webapi,我正在构建.NETCore3.1WebAPI。向Web API发送请求。我正在使用System.Net.Http库。我将JSON放入POST请求主体中。这是Web API端处理程序: using Microsoft.AspNetCore.Mvc; [ApiController] public class MyController : ControllerBase { [HttpPost] public int HandleRequest([FromBody] string jso
using Microsoft.AspNetCore.Mvc;
[ApiController]
public class MyController : ControllerBase
{
[HttpPost]
public int HandleRequest([FromBody] string jsonString)
{
return 1;
}
}
下面的代码将空ArrayList发送到Web API,但它始终返回“解析值行1位置1时遇到意外字符”
我尝试使用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();
为什么我需要进行双重序列化才能使其工作?首先,当您使用异步方法时,应该添加wait关键字:
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;
}
出现错误,因为终结点需要字符串,但在第一次序列化中,您正在发送数组。
第二个序列化工作,因为首先将ArrayList
序列化为string
,然后将string
序列化为string
。最后,您意外地发送了一个序列化字符串,端点可以对其进行反序列化
错误
“解析值行1,位置1时遇到意外字符。”
表示服务器接收第一个字符[
,但它需要"
因为它试图将JSON反序列化为字符串-但它是数组。JavaScriptSerializer
和ArrayList
不建议使用?这两个代码段之间的唯一区别似乎是,您将序列化程序存储在第二个代码段中的本地文件中。您不会像建议的那样在这里序列化两次。@500 InternalServer错误他序列化了两次。首先调用serializeArrayList
到string
,然后调用string
到string
-这就是端点工作的原因。[FromBody]string jsonString
替换到[FromBody]ArrayList
或任何集合。@hotel:他就是这样-我现在看到了。
[HttpPost]
public int HandleRequest([FromBody] ArrayList list)
{
return 1;
}
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: "[]"