Динамически выбирайте атрибуты для сериализации в ответе JSON в ядре asp.net - PullRequest
0 голосов
/ 04 июня 2018

У меня есть контроллер, подобный следующему:

using Microsoft.AspNetCore.Mvc;

public class Person {
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

[Route("api/[controller]")]
public class ValuesController : Controller {
    [HttpGet]
    public IActionResult Get() {
        return new OkObjectResult(new[] {
            new Person { FirstName = "John", LastName = "Doe" }
        });
    }
}

Я хотел бы иметь возможность указать свойства, которые я хочу получить из ответа в основном REST API asp.net.
Например,GET до api/values должен возвращать объект со всеми его свойствами:

{
  "FirstName":"John",
  "LastName":"Doe"
}

В то время как GET до api/values?fields=FirstName должен возвращать только свойство FirstName:

{
  "FirstName":"John"
}

Я попытался указать ContractResolver в моем классе запуска следующим образом:

class QueryStringResolver : DefaultContractResolver {
    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) {
        HttpContextAccessor httpContextAccessor = new HttpContextAccessor();
        string fieldsQuery = httpContextAccessor.HttpContext.Request.Query["fields"];
        if (!string.IsNullOrEmpty(fieldsQuery)) {
            var fields = from f in fieldsQuery.Split(",", StringSplitOptions.RemoveEmptyEntries) select f.Trim().ToLowerInvariant();
            return base.CreateProperties(type, memberSerialization).Where(p => fields.Contains(p.PropertyName.ToLowerInvariant())).ToList();
        } else {
            return base.CreateProperties(type, memberSerialization);
        }
    }
}

public class Startup {
    public void ConfigureServices(IServiceCollection services) {
        services
            .AddMvc()
            .AddJsonOptions(options => {
                options.SerializerSettings.ContractResolver = new QueryStringResolver();
            });
    }
    // rest of Startup class omitted...
}

Проблема в том, что метод CreateProperties вызывается только при первом запросе, а не для каждого запроса.

Есть ли способ указать, какие свойства должны сериализоваться при каждом запросе?

Обратите внимание, что Я не хочу менять реализацию метода Get или возвращенное определение класса , я быкак и в случае с сериализацией, чтобы я мог повторно использовать один и тот же параметр строки запроса в нескольких методах.

1 Ответ

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

Создайте общий объект с желаемыми значениями.

var obj = new {
  FirstName = "John"
  , LastName = "Doe"
};

var json = JsonConvert.SerializeObject(obj);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...