Я создаю веб-службу, которая генерирует случайные личные данные (отсюда и включение счетчика в приведенный ниже код), используя комбинацию сторонней веб-службы и методов. Однако, когда я указал тип контента как
application/json
, результат содержит escape-символы обратной косой черты.
Из того, что я прочитал, это, вероятно, результат используемой сериализации, но, несмотря на то, что я попробовал несколько решений, я не могу решить проблему.
Модель данных
public class Response
{
public string name { get; set; }
public string surname { get; set; }
public string address { get; set; }
public string telephone { get; set; }
public string email { get; set; }
public string dateOfBirth { get; set; }
public string sex { get; set; }
public string countryOfBirth { get; set; }
public string currency { get; set; }
}
Метод
public class DatasetServices
{
public string GenerateDataset()
{
int counter = 3;
StringBuilder result = new StringBuilder();
for (int i = 0; i < counter; i++)
{
try
{
Dataset dataset = new Dataset();
Dataset.Item item = new Dataset.Item();
string apiKey = "KEY";
HttpWebRequest apiRequest = WebRequest.Create("URI" + apiKey) as HttpWebRequest;
string apiResponse = "";
using (HttpWebResponse response = apiRequest.GetResponse() as HttpWebResponse)
{
StreamReader reader = new StreamReader(response.GetResponseStream());
apiResponse = reader.ReadToEnd();
}
Response responseObject = JsonConvert.DeserializeObject<Response>(apiResponse);
item.name = responseObject.name;
item.surname = responseObject.surname;
item.address = responseObject.address;
item.city = GenerateCity();
item.telephone = responseObject.telephone;
item.email = responseObject.email;
item.dateOfBirth = responseObject.dateOfBirth;
item.sex = responseObject.sex;
item.maritalStatus = GenerateMaritalStatus();
item.nationality = responseObject.countryOfBirth;
item.countryOfBirth = responseObject.countryOfBirth;
item.grossAnnualIncome = GenerateGrossAnnualIncome();
item.currency = responseObject.currency;
var json = JsonConvert.SerializeObject(item);
result.Append(json);
}
catch (Exception)
{
if (i == counter)
{
throw;
}
}
}
string output = result.ToString();
return output;
throw new ArgumentOutOfRangeException("The generation counter was equal to zero.");
}
Контроллер
[HttpGet]
public ActionResult<IEnumerable> OutputDataset()
{
Response.ContentType = "application/json";
return datasetServices.GenerateDataset();
}
Результат
"{\"name\":\"Sibby\",\"surname\":\"Packman\",\"address\":\"59 Aberg Alley\",\"city\":\"San Javier\",\"telephone\":\"6322049027\",\"email\":\"[email protected]\",\"dateOfBirth\":\"10/22/1987\",\"sex\":\"Female\",\"maritalStatus\":\"Single\",\"nationality\":\"RU\",\"countryOfBirth\":\"RU\",\"grossAnnualIncome\":71000,\"currency\":\"RUB\"}{\"name\":\"Mariska\",\"surname\":\"Worrell\",\"address\":\"927 Green Ridge Point\",\"city\":\"Frisco\",\"telephone\":\"5668115189\",\"email\":\"[email protected]\",\"dateOfBirth\":\"10/1/1998\",\"sex\":\"Female\",\"maritalStatus\":\"Single\",\"nationality\":\"GT\",\"countryOfBirth\":\"GT\",\"grossAnnualIncome\":24000,\"currency\":\"GTQ\"}{\"name\":\"Eleonore\",\"surname\":\"Follan\",\"address\":\"3876 Colorado Avenue\",\"city\":\"Mont-Dore\",\"telephone\":\"4004483706\",\"email\":\"[email protected]\",\"dateOfBirth\":\"3/6/1992\",\"sex\":\"Female\",\"maritalStatus\":\"Married\",\"nationality\":\"CN\",\"countryOfBirth\":\"CN\",\"grossAnnualIncome\":50000,\"currency\":\"CNY\"}"
Приносим свои извинения за то, что не включили результаты. Я обновил свой вопрос с ним. Между тем, обратная косая черта также включается при просмотре ответа в формате JSON в ReadyAPI.
То, что вы опубликовали, представляет собой строку, содержащую действительный JSON. Нам нужно больше узнать о вашей системе, чтобы определить, действительна она или нет.
Я использую Visual Studio Community 15.9.6 и .Net Framework 4.7.03056. Пожалуйста, сообщите, какая еще информация вам нужна.
Это действительно полный ответ на вызов API? Я подозреваю, что [ и ] отсутствуют.
Да, это все, что есть. Что-то определенно не так.
Выходной набор данных возвращает перечисление. Вероятно, это будет список строк, поэтому у вас есть экранированная строка... сделайте так, чтобы она возвращала простую строку, и вы должны получить лучшие результаты.
Попробовал, но результат идентичен.
OutputDataSet() возвращает ActionResult<IEnumerable>, но GenerateDataset() возвращает string. Единственная причина, по которой это работает, заключается в том, что string реализует IEnumerable<char>, что означает, что в основном ваш метод возвращает перечисление объектов, которые могут быть чем угодно, но не символами. ...
Это странная вещь, и я удивлен, что она вообще работает, но результат, похоже, является дубликатом JSON.NET Parser кажется будет дважды сериализовать мои объекты. И решение должно быть таким же - объявите, что ваш метод возвращает ActionResult<IEnumerable<T>> для некоторого подходящего T (здесь, видимо, Dataset.Item?), и позвольте фреймворку выполнить сериализацию. Не делай этого сам.
Имеет смысл, поскольку я подозревал, что причиной была сериализация. Однако объявление о том, что метод возвращает ActionResult<IEnumerable<Dataset.Item>>, создает другую проблему: преобразование результата из StringBuilder.
Не создавайте StringBuilder вообще; вообще ничего не сериализуйте вручную. Просто сделайте так, чтобы datasetServices.GenerateDataset(); возвращал List<Dataset.Item>, затем возвращал ActionResult<List<Dataset.Item>> из OutputDataset(), и пусть фреймворк сделает всю работу.
Это помогло. Спасибо за помощь.





Вот решение проблемы, любезно опубликованное dbc.
That's an odd things to do and I'm surprised it works at all, but the result seems to be a duplicate of JSON.NET Parser seems to be double serializing my objects. And the solution should be the same -- declare that your method returns an ActionResult> for some appropriate T (here ` Dataset.Item apparently?) and let the framework do the serialization. Don't do it yourself.
Что заставляет вас думать, что результат содержит обратную косую черту? Вы уверены, что не только Visual Studio отображает вам строку?