Как вернуть JSON Array в ASP.NET Web API C # - PullRequest
0 голосов
/ 01 июня 2018

Я хочу вернуть (отобразить в веб-браузере) массив json в следующем формате.

{
    "RainfallAreaAVG": [
    {
        "AreaBbsID": "18",
        "DistCount": "1",
        "SubDistCount": "2",
        "Amount": "14",
        "Hail": "14",
        "ArealDetails": [
                {
                    "DistBbsID": "101",
                    "SubDistCount": "2",
                    "Amount": "14",
                    "Hail": "14",
                    "SubDistCount": "2",
                    "DistDetails": [
                        {
                            "SubDistBbsID": "101",
                            "Amount": "14",
                            "Hail": "2",
                            "Date": "2011-06-13"
                        },
                        {
                            "SubDistBbsID": "102",
                            "Amount": "10",
                            "Hail": "0",
                            "Date": "2011-06-13"
                        }
                    ]
                }
            ]
        }
    ]
}

Я использую веб-API asp.net (MVC) в c # и Entity Framework 5.0, ADO.NetEntity Data Model как моя модель.

Я использую хранимую процедуру для получения данных из базы данных sql server:

enter image description here

В настоящее времяЯ использую код ниже в моем контроллере

namespace RainfallService.Controllers
{
    public class DistAVGController : ApiController
    {

        [HttpGet]
        public List<SP_GetRainfallByDistDateAVG_Result> GetRainfall(string distBbsID, string entryDate)
        {
            using (var db = new Farmer_WebEntities())
            {
                var rainfalls = db.SP_GetRainfallByDistDateAVG(distBbsID, entryDate).ToList();
                return rainfalls;
            }
        }

        [HttpGet]
        public List<SP_GetRainfallByDistDateAVGDetails_Result> GetRainfall(string distBbsID, string entryDate,string type)
        {
            using (var db = new Farmer_WebEntities())
            {
                var rainfalls = db.SP_GetRainfallByDistDateAVGDetails(distBbsID, entryDate).ToList();
                return rainfalls;
            }
        }

    }
}

И мой вывод похож на тот, который мне не нужен.

For Average For Details

Модель данных сущности ADO.Net с использованием, как показано ниже enter image description here

Классы моделей, которые я использую

namespace RainfallService
{
    using System;

    public partial class SP_GetRainfallByDistDateAVG_Result
    {
        public string AreaBbsId { get; set; }
        public string DistBbsID { get; set; }
        public Nullable<int> SubDistCount { get; set; }
        public Nullable<decimal> Amount { get; set; }
        public Nullable<int> Hail { get; set; }
    }
}

И

namespace RainfallService
{
    using System;

    public partial class SP_GetRainfallByDistDateAVGDetails_Result
    {
        public string AreaBbsId { get; set; }
        public string DistBbsID { get; set; }
        public string SubDistBbsId { get; set; }
        public Nullable<decimal> Amount { get; set; }
        public Nullable<int> Hail { get; set; }
    }
}

Мой WebApiConfig.cs как показано ниже

namespace RainfallService
{
    public class WebApiConfig
    {       
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services

            EnableCorsAttribute cors = new EnableCorsAttribute("*", "*", "*");
            config.EnableCors(cors);

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            config.Formatters.Remove(config.Formatters.XmlFormatter);
            //config.Formatters.JsonFormatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;
            //var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
            //jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
        }
    }
}

Кто-нибудь может мне помочь, пожалуйста ???

Ответы [ 2 ]

0 голосов
/ 01 июня 2018
public class ActualRainfall
{


    public List<Rainfallareaavg> RainfallAreaAVG { get; set; }
}
    public class Rainfallareaavg
    {
        public string AreaBbsID { get; set; }
        public string DistCount { get; set; }
        public string Amount { get; set; }
        public string Hail { get; set; }
        public List<Arealdetail> ArealDetails { get; set; }
    }

    public class Arealdetail
    {
        public string DistBbsID { get; set; }
        public string SubDistCount { get; set; }
        public string Amount { get; set; }
        public string Hail { get; set; }
        public List<Distdetail> DistDetails { get; set; }
    }

    public class Distdetail
    {
        public string SubDistBbsID { get; set; }
        public string Amount { get; set; }
        public string Hail { get; set; }
        public string Date { get; set; }
    }

Сделайте этот класс модели установленным в качестве этого класса модели повторно устанавливаемый тип GetRainFall ().

GlobalConfiguration.Configuration.Formatters.Clear();
GlobalConfiguration.Configuration.Formatters.Add(new JsonMediaTypeFormatter());

в WebApiConfig.cs

ИЛИ при создании APIПропуск "Application / JSON" в шапке

0 голосов
/ 01 июня 2018

Если вы хотите вернуть предварительно подтвержденный JSON по умолчанию, вам нужно настроить средство форматирования типа мультимедиа в WebApiConfig.

В качестве быстрого примера, в методе WebApiConfig.Register (HttpConfiguration config),

config.Formatters.Clear();
config.Formatters.Add(new JsonMediaTypeFormatter() {
    SerializerSettings = new JsonSerializerSettings {
        Formatting = Formatting.Indented
    }
};

Здесь также можно установить другие параметры по умолчанию, такие как сериализация свойств для camelCase (CamelCasePropertyNamesContractResolver) или исключить вывод нулевых свойств (NullValueHandling.Ignore).

Для добавленияВаш список для нового объекта, который имеет единственное свойство, RainfallAreaAVG, я бы сделал следующее:

  • Измените тип возвращаемого значения для ваших действий контроллера на IHttpActionResult

  • Возвращает анонимный объект со значением вашего нового имени свойства, равным списку, который вы хотите вернуть

Ваш контроллер может выглядеть так:

namespace RainfallService.Controllers
{
    public class DistAVGController : ApiController
    {

        [HttpGet]
        public IHttpActionResult GetRainfall(string distBbsID, string entryDate)
        {
            using (var db = new Farmer_WebEntities())
            {
                var rainfalls = db.SP_GetRainfallByDistDateAVG(distBbsID, entryDate).ToList();
                return Ok(new {RainfallAreaAVG = rainfalls});
            }
        }

        [HttpGet]
        public IHttpActionResult GetRainfall(string distBbsID, string entryDate,string type)
        {
            using (var db = new Farmer_WebEntities())
            {
                var rainfalls = db.SP_GetRainfallByDistDateAVGDetails(distBbsID, entryDate).ToList();
                return Ok(new {RainfallAreaAVG = rainfalls});
            }
        }

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...