Почему Controller.Json и Newtonsoft Json дают разные результаты? - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть объект anonymouse, который содержит коллекцию объектов anonymouse, но изменение его на json отличается от controller's Json до Newtonsoft Json - как я могу удалить эти дополнительные поля из Json(data)?

var dataFromDb = _context
                 .Users
                 .Select(x => new { x.id, x.name })
                 .ToList();

var data = new { something = true, data = dataFromDb};

Результат при использовании Newtonsoft json:

return StatusCode(200, JsonConvert.SerializeObject(data));

{
    "something": true,
    "data": [
        {
            "id": "d5696edd-4321-4dba-9eba-c4df3644bb78",
            "name": "XYZ"
        }
    ]
}

return StatusCode(200, Json(data));

{
    "contentType": null,
    "serializerSettings": null,
    "statusCode": null,
    "value":
    {
        "something": true,
        "data": 
        [
            {
                "id": "d5696edd-4321-4dba-9eba-c4df3644bb78",
                "name": "XYZ"
            }
        ]
    }
}

1 Ответ

3 голосов
/ 18 апреля 2019

Потому что Controller.Json создает JsonResult объект, который содержит дополнительные параметры. Обзор их можно найти здесь . Принимая во внимание, что Newtonsoft сериализует указанный объект в строку JSON.

В отношении данных (которые вы сериализуете) они дают одинаковый результат.


Если вы хотите добавить эти свойства, это нормальное использование геттеров и сеттеров для объекта:

return new JsonResult(result)
{
    StatusCode = 200
};

И этот объект должен быть возвращен из контроллера вместо return StatusCode(200, Json(data));


Также стоит отметить, что Json - это метод расширения (вспомогательный метод) для JsonResult. Они оба возвращают одну и ту же вещь, экземпляр JsonResult (который в свою очередь наследует ActionResult).

Вызов Json или JsonResult является вопросом предпочтения, вам придется писать меньше для Json и не нужно будет объявлять экземпляры JsonResult в вашем контроллере, как это будет сделано за сцены для вас.

...