При анализе строки 1, позиция 1 обнаружен неожиданный символ - PullRequest
3 голосов
/ 06 августа 2020

Я создаю. Net Веб-API Core 3.1. Для отправки запросов к веб-API. Я использую библиотеку System. Net .Http. Я помещаю JSON в тело запроса POST. Это боковой обработчик веб-API:

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

Приведенный ниже код отправляет пустой список ArrayList в веб-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 и поигрался с объектом для сериализации, но он всегда возвращает ту же ошибку. Но потом я обнаружил, что если я сделаю сериализацию дважды, она начнет работать. Итак, приведенный ниже код работает - отправляет запрос без ошибок и данные на стороне веб-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();

Почему мне нужно выполнять двойную сериализацию, чтобы он работал?

Ответы [ 2 ]

0 голосов
/ 06 августа 2020
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 в строка - но это был массив.

0 голосов
/ 06 августа 2020

Во-первых, когда вы используете асинхронные c методы, вы должны добавить ключевое слово 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...