Я хочу передать ключу нулевое значение с помощью запроса POST в API.
Например, я хочу передать приведенные ниже данные JSON. То есть Exp и TeamID равны нулю.
{
"ID":162617,
"TextKey":"107737",
"Exp":null,
"TeamID":null
}
Результат принимается в Postman, но когда я попытался передать то же самое с помощью приведенного ниже кода C#, мой контент JSON стал недействительным.
long idvalue = 162617;
string textkeyvalue = "107737";
string expvalue = null;
long? teamIDvalue = null;
string postData = "{\"ID\":" + idvalue + ",\"TextKey\":\"" + textkeyvalue + "\",\"Exp\":\"" + expvalue + "\",\"TeamID\":\"" + teamIDvalue + "\"}";
Что дает мне следующий вывод.
{
"ID":162617,
"TextKey":"107737",
"Exp":"",
"TeamID":
}
И мой запрос не выполняется из-за недопустимого тела JSON. Итак, как мне передать такого рода нулевые данные или нулевое ключевое слово?
Примечание. Все пары значений ключа являются обязательными в моем API, поэтому я не могу опустить их, если они равны нулю.
Я просто хочу передать данные в формате ниже.
{
"ID":162617,
"TextKey":"107737",
"Exp":null,
"TeamID":null
}
на самом деле я получаю эти нулевые значения от какого-то другого API, которые я загружаю в этот новый API, с которым я работаю.
Во-первых, вам не нужно создавать строку JSON вручную, а использовать какую-то библиотеку... Что, если, например, textKey
содержит кавычку "
?
Отвечает ли это на ваш вопрос? Как создать строку JSON в C#
Чтобы ответить на ваш вопрос, чтобы написать текст для нулевого значения, вы можете сделать это:
var result = "my value is " + (strValue ?? "null");
Или добавить цитаты:
var result = "my value is " + (strValue == null ? "null" : $"\"{strValue}\"");
Вы также можете создать статические вспомогательные методы, чтобы упростить задачу:
static string write(string str) => str == null ? "null" : $"\"{str}\"";
static string write(long? value) => value == null ? "null" : value.ToString();
Итак, в вашем примере это становится:
string postData = "{\"ID\":" + idvalue + ",\"TextKey\":" + write(textkeyvalue) +
",\"Exp\":" + write(expvalue) + ",\"TeamID\":" +
write(teamIDvalue) + "}";
Создайте класс для модели данных и используйте библиотеку (например, System.Text.Json) для его сериализации, например:
public class MyData
{
public long ID { get; set; }
public string TextKey { get; set; }
public string Exp { get; set; }
public long? TeamID { get; set; }
}
// Construct model
var data = new MyData()
{
ID = 162617,
TextKey = "107737",
Exp = null,
TeamID = null,
}
// Serialize to JSON
var result = System.Text.Json.JsonSerializer.Serialize(data);
Большое спасибо за объяснение @gepa, это сработало. Извините, я забыл упомянуть, что у меня работает .net 4.0, поэтому System.Text.Json у меня не работает. поэтому я использовал DataContractJsonSerializer, используя вашу структуру, и это сработало отлично. большое спасибо
ответ gepa прав на деньги, но вы также можете сериализовать анонимный объект:
long idvalue = 162617;
string textkeyvalue = "107737";
string? expvalue = null;
long? teamIDvalue = null;
string postData = System.Text.Json.JsonSerializer.Serialize(new
{
ID = idvalue,
TextKey = textkeyvalue,
Exp = expvalue,
TeamID = teamIDvalue,
});
Спасибо @padeso, это сработало. Извините, я забыл упомянуть, что у меня работает .net 4.0, поэтому System.Text.Json.JsonSerializer у меня не работает. поэтому я использовал DataContractJsonSerializer, используя вашу структуру, и это сработало отлично. большое спасибо.
Не совсем понял проблему. Если это null, то явно напишите null без кавычек. Кроме того, вы должны подумать о создании «настоящего» класса для данных и использовать стандартный jsonserializer. Он будет иметь дело с нулем.