Невозможно увидеть все вложенные свойства объекта JSON - PullRequest
0 голосов
/ 08 июля 2019

У меня есть проект .NET Core Web API, и одно из моих действий API возвращает объект в формате JSON. Этот объект имеет 3 уровня глубины, и я ожидаю, что он будет выглядеть так:

{
    "pickupDate": "0001-01-01T00:00:00",
    "pickupLocation": {
        "address1": null,
        "address2": null,
        "address3": null,
        "cityStateCountry": {
        "city": null,
        "state": null,
        "country": null
        },
        "zip": null
    },
    "po": 12345,
    "itemNameAndDesc": "BobSled"
}

Вместо этого cityStateCountry объект просто отображается как null. Я проверил, используя и Postman, и вывел весь объект json на вид с помощью angular.

{
    "pickupDate": "0001-01-01T00:00:00",
    "pickupLocation": {
        "address1": null,
        "address2": null,
        "address3": null,
        "cityStateCountry": null, //???
        "zip": null
    },
    "po": 12345,
    "itemNameAndDesc": "BobSled"
}

Насколько я понимаю, это проблема на стороне сервера. Почему .NET Core делает это и как я могу это исправить? Действие, которое получает данные, показано ниже:

// GET: api/Shipments/5
        [HttpGet("{id}")]
        public async Task<ActionResult<dynamic>> GetShipment(long id)
        {
            var ship = await _context.Shipments
                .Where(c => !c.IsProcessed)
                .Select(c => new
                {
                    c.PO,
                    c.ItemNameAndDesc
                })
                .FirstOrDefaultAsync(c => c.PO == id);

            if (ship == null)
            {
                return null;
            }
            var shipmentformviewmodel = new ShipmentFormViewModel()
            {
                PickupDate = new DateTime(),
                PickupLocation = new PickupLocation(),
                PO = ship.PO,
                ItemNameAndDesc = ship.ItemNameAndDesc

            };

            return shipmentformviewmodel;
        }

Ответы [ 2 ]

0 голосов
/ 09 июля 2019

в ядре .net Пустые поля автоматически не помещаются в Json. Вы должны внести это изменение в ConfigureServices в классе StartUp:

            services.AddMvc(option =>
            {
                option.OutputFormatters.RemoveType(typeof(HttpNoContentOutputFormatter));
                option.OutputFormatters.Insert(0, new HttpNoContentOutputFormatter
                {
                    TreatNullValueAsNoContent = false
                });
            });
0 голосов
/ 08 июля 2019

Так что не уверен, что вы бы классифицировали это как «обходной путь» или реальное решение, но объект cityStateCountry был буквально null (у него не было ни одного из его инициализированных элементов), так что если я зайду на стороне .NET и фактически инициализировать эти переменные (будь то в действии или просто в конструкторе), я на самом деле могу видеть все уровни моего объекта json как таковые:

{
    "pickupDate": "0001-01-01T00:00:00",
    "pickupLocation": {
        "address1": null,
        "address2": null,
        "address3": null,
        "cityStateCountry": {
        "city": "",
        "state": "",
        "country": ""
        },
        "zip": null
    },
    "po": 12345,
    "itemNameAndDesc": "BobSled"
}

В зависимости от требований, пустая строка и null могут означать одно и то же (и для моего требования это верно).

...