Почему мой контроллер MVC возвращает неформатированный и заключенный в кавычки JSON?

Я не получаю надлежащего возврата JSON. Любые идеи? Есть лучший способ сделать это? Нужен ли мне DataTable?

public JsonResult ReportData(string pdfID)
{
    string sqlConnectionString = @"ConnectThatThangStuff;";
    string queryString = @"SELECT stuffs FROM Thingy;";

    var json = string.Empty;
    using (SqlConnection connection = new SqlConnection(sqlConnectionString))
    {
        SqlCommand cmd = new SqlCommand(queryString, connection);

        connection.Open();
        SqlDataReader reader = cmd.ExecuteReader();

        DataTable dt = new DataTable();
        dt.Load(reader);

        json = JsonConvert.SerializeObject(dt);
    }

    return Json(json, JsonRequestBehavior.AllowGet);
}

И что я получу за свои усилия? Эта хрень:

"[{\"transid\":1111,\"FromEmailAddress\":\"[email protected]\",\"Name\":\"bob doe\",\"EmailAddress\":\"[email protected]\",\"CreateDt\":\"4/08/2021\",\"ExpirationDt\":\"5/08/2021\",\"Status\":\"Complete\",\"FinalDt\":\"4/09/2021\"},{\"transid\":22222,\"FromEmailAddress\":\"[email protected]\",\"Name\":\"bill doe\",\"EmailAddress\":\"[email protected]\",\"CreateDt\":\"4/08/2021\",\"ExpirationDt\":\"5/08/2021\",\"Status\":\"Ready\",\"FinalDt\":null}]"

На мой взгляд, мне нужен JOSN для создания jQuery DataTable. Если есть более простой способ перейти от SQL Query — ›jQuery DataTable, я тоже воспользуюсь этим.

Я не использую Entity Framework.

Если вам нужно сериализовать DataTable с помощью System.Text.Json, см. Сериализовать DataSet с текущей версией System.Text.Json.JsonSerializer.   —  person flashsplat    schedule 12.04.2021

См. также:  Получить информацию из подгруппы firestore + FLUTTER
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 3
  1. flashsplat

    return Json(object); выполняет сериализацию за вас, попробуйте передать dt прямо туда

    Хорошо спасибо. Когда я это делаю, я получаю: A circular reference was detected while serializing an object of type 'System.Reflection.RuntimeModule'. person flashsplat; 09.04.2021

  2. flashsplat

    Как говорили другие, вы дважды сериализуете. Вы можете решить эту проблему, избегая при этом проблемы с циклической ссылкой, используя _ 1_ вместо метода _ 2_ в вашем контроллере:

    // serialize using Json.Net (handles DataTable cleanly)
    json = JsonConvert.SerializeObject(dt);   
    
    // Return the already-serialized JSON string with a content type of application/json
    return Content(json, "application/json");
    

    Вам также потребуется изменить подпись метода, чтобы он возвращал _ 4_ (или _ 5_) вместо _ 6_.

    Спасибо, это именно то, чем я закончил. person flashsplat; 10.04.2021

  3. flashsplat

    Вы дважды конвертируете объект в JSON:

    json = JsonConvert.SerializeObject(dt);
    
    return Json(json, JsonRequestBehavior.AllowGet);
    

    Фактически, если вы присмотритесь, вы увидите, что ваша переменная json является строкой.

    Когда вы передаете строку методу Json, он преобразует строку в json, что и есть у вас.


    Я предлагаю вам пропустить звонок на JsonConvert.Serialize и просто позвонить Json(dt).

    Однако небольшой совет: JsonConvert.Serialize вызывает Newtonsoft Json (JSON.NET) для сериализации. Вызывая Json напрямую, ASP.Net будет обрабатывать сериализацию, и, если она не настроена должным образом, вы можете System.Text.Json позаботиться о сериализации за вас, что немного изменит то, как вы справляетесь с проблемами сериализации, такими как изменение корпуса, настройка имен свойств и решение конверсии.

    Спасибо за подробное объяснение. Я получаю следующее сообщение об ошибке: A circular reference was detected while serializing an object of type 'System.Reflection.RuntimeModule'. Что я буду исследовать. person flashsplat; 09.04.2021

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: