Язык: C# .net framework 4.8 Visual Studio 2019.
Я пытался отправить json в API, и если я отправлю его как строку:
string jsonString = JsonConvert.SerializeObject(dataToSend, Formatting.Indented);
var result = await urlApi.
WithTimeout(TimeSpan.FromSeconds(timeout)).
PostJsonAsync(jsonString).
ReceiveString();
ПРИМЕЧАНИЕ. dataToSend — это объект dotnet. Я использую json-фреймворк Newtonsoft: https://www.newtonsoft.com/json , чтобы сериализовать объект в json. Я использую flurl: https://flurl.dev/, чтобы отправить json.
Удаленный хост отвечает с ошибкой:
{
"Status": "-1",
"Description": "System.NullReferenceException: Object reference not set to an instance of an object.",
"Result": null
}
Однако, когда я отправляю объект напрямую:
var result = await urlApi.
WithTimeout(TimeSpan.FromSeconds(timeout)).
PostJsonAsync(dataToSend).
ReceiveString();
ПРИМЕЧАНИЕ. dataToSend — это объект dotnet.
Я не получаю никаких ошибок.
Я хочу знать, почему отправка json в виде строки вызывает ошибку.
Ты знаешь почему?
¿Как я могу это узнать?
Согласен, похоже, вы дважды сериализуете свой JSON. Вопрос JSON.NET Parser, похоже, выполняет двойную сериализацию моих объектов занимается этим на стороне сервера; по сути вы делаете то же самое на стороне клиента.





Ваша проблема в том, что вы дважды сериализуете свой JSON. Используемый вами метод расширения, GeneratedExtensions.PostJsonAsync(url этой строки, тело объекта, ...), работает следующим образом:
Создает FlurlRequest и отправляет асинхронный запрос POST.
URL - Этот URL.
body — объект, представляющий тело запроса, который будет сериализован в JSON.
Поскольку ваш jsonString уже сериализован в JSON, он сериализуется второй раз как строковый литерал JSON, в результате чего удаленный хост возвращает ошибку, которую вы видите.
Если по какой-то причине вам нужно сериализовать JSON вручную, вы можете опубликовать его с помощью Flurl.Http.Content.CapturedJsonContent:
var result = await urlApi.
WithTimeout(TimeSpan.FromSeconds(timeout)).
PostAsync(new CapturedJsonContent(jsonString)).
ReceiveString();
Я сильно подозреваю, что если вы посмотрите на HTTP-запрос в сети, вы увидите, что JSON представляет собой именно то, что вы сказали: строку. Я подозреваю, что это будет что-то вроде:
"{ \"x\": \"Some value\", \"y\": \"Some other value\" }"(включая все кавычки и обратную косую черту). Это представление строки в формате JSON.