Я использую веб-API ASP.NET 2 для возврата DataTable в виде строки JSON. Но строка ответа имеет неправильный формат JSON. Вот результат работы веб-API:
"[{\"RESERVATIONDATE\":\"20180725\",\"SCHEDULE_CODE\":619675,\"DEPARTURE_SEQ\":1,\"ARRIVAL_SEQ\":3,\"SCHEDULE_ROUTE\":9107,\"SCHEDULE_ROUTE_NAME\":\"LHR-SWL-MTN\",\"SCHEDULE_DEPARTURE_TIME\":\"2215\",\"SCHEDULE_ARRIVAL_TIME\":\"0330\",\"SCHEDULE_TIMECODE\":\"1\",\"SCHEDULE_BUSTYPE\":14,\"SCHEDULE_EXTRA\":\"N\",\"DEPARTURE_NAME\":\"LAHORE\",\"ARRIVAL_NAME\":\"MULTAN\",\"FARE_FARE\":750.0,\"BUSTYPE\":\"Super Luxury (Discount)\",\"BUSTYPE_NAME\":\"DISC\",\"TDAY\":0.0,\"RTIME\":73.0,\"BUSTYPE_SEATS\":45,\"STAFF_SEAT\":2,\"AVAILABLE\":31.0,\"RESERVED\":12.0,\"DELIVERED\":1.0,\"SCHEDULE_REMAIN\":\" \",\"CURRENT_OPEN\":\"N\",\"TRIP_STATUS\":\"DROP\",\"DEPARTURE\":\"LHR\",\"ARRIVAL\":\"MTN\",\"FARE_Y\":0.0}]"
Но мне нужен ответ в таком формате:
{
"Success": true,
"Response": [
{
"RESERVATIONDATE": "20180725",
"SCHEDULE_CODE": 619675,
"DEPARTURE_SEQ": 1,
"ARRIVAL_SEQ": 3,
"SCHEDULE_ROUTE": 9107,
"SCHEDULE_ROUTE_NAME": "LHR-SWL-MTN",
"SCHEDULE_DEPARTURE_TIME": "2215",
"SCHEDULE_ARRIVAL_TIME": "0330",
"SCHEDULE_TIMECODE": "1",
"SCHEDULE_BUSTYPE": 14,
"SCHEDULE_EXTRA": "N",
"DEPARTURE_NAME": "LAHORE",
"ARRIVAL_NAME": "MULTAN",
"FARE_FARE": 750,
"BUSTYPE": "Super Luxury (Discount)",
"BUSTYPE_NAME": "DISC",
"TDAY": 0,
"RTIME": 60,
"BUSTYPE_SEATS": 45,
"STAFF_SEAT": 2,
"AVAILABLE": 31,
"RESERVED": 12,
"DELIVERED": 1,
"SCHEDULE_REMAIN": " ",
"CURRENT_OPEN": "N",
"TRIP_STATUS": "DROP",
"DEPARTURE": "LHR",
"ARRIVAL": "MTN",
"FARE_Y": 0
} ]
}
Вот мой код для сериализации данных в JSON:
JavaScriptSerializer serializer = new JavaScriptSerializer();
DataTable dt =await oracleManager.GetSchedule(Departure, Arrival, Date);
if (dt.Rows.Count > 0)
{
List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
Dictionary<string, object> row;
foreach (DataRow dr in dt.Rows)
{
row = new Dictionary<string, object>();
foreach (DataColumn col in dt.Columns)
{
row.Add(col.ColumnName, dr[col]);
}
rows.Add(row);
}
return await Task.FromResult(serializer.Serialize(rows));
}
Вот средство форматирования мультимедиа, которое я добавил в файл конфигурации:
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
Как решить эту проблему и получить желаемый формат?
серьезно ... не знаю, почему отрицательные ...





Вам нужно создать тип для хранения таблицы и вашего сообщения об успехе, или вы используете анонимный объект
DataTable dt =await oracleManager.GetSchedule(Departure, Arrival, Date);
if (dt.Rows.Count > 0)
{
List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
Dictionary<string, object> row;
foreach (DataRow dr in dt.Rows)
{
row = new Dictionary<string, object>();
foreach (DataColumn col in dt.Columns)
{
row.Add(col.ColumnName, dr[col]);
}
rows.Add(row);
}
//add this line
var output = new { Success = true, Response = rows };
// then serialize the new object
return await Task.FromResult(output);
}
Вам действительно не нужно выполнять ручную сериализацию в WebApi. Если вы просто вернете свой словарь непосредственно в методе контроллера, вы должны получить правильный вывод JSON.
WebApi автоматически преобразует его в JSON.
Не знаю, почему вы получаете все эти отрицательные голоса, вопрос кажется вполне законным и со всеми необходимыми деталями.