Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 分析值行1位置1时遇到意外字符_C#_Asp.net Core_Asp.net Core Webapi - Fatal编程技术网

C# 分析值行1位置1时遇到意外字符

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

我正在构建.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 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错误他序列化了两次。首先调用serialize
ArrayList
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: "[]"