Привязка модели возвращает ноль, когда строка размещена вместо массива - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть .Net Core 3 Api, когда я использую Netonsoft для выполнения привязки модели.

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<KestrelServerOptions>(options => { options.AllowSynchronousIO = true; });
        services.Configure<IISServerOptions>(options => { options.AllowSynchronousIO = true; });
        services.AddOptions();
        services.AddMvcCore().SetCompatibilityVersion(CompatibilityVersion.Version_3_0).AddNewtonsoftJson();
        services.AddHealthChecks()
            .AddCheck<ApiHealthCheck>("api");

    }
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        app.UseRouting();
        app.UseAuthentication();
        app.UseAuthorization();
        app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
        app.UseHealthChecks("/health");
    }
}

В Api я ожидаю модель, похожую на:

public class Family
{
    public Member Member1 { get; set; }
    public Member Member2 { get; set; }
}

public class Member
{
    public string FirstName { get; set; }
    public List<string> LastNames { get; set; }
}

Сейчаскогда я публикую следующий Json, привязка модели дает мне семейный объект со значениями, взятыми из Json:

{
    "member1": {
        "firstName": "john",
        "lastNames": [
            "wick"
        ]
    },
    "member2": {
        "firstName": "Rich",
        "lastNames": null
    }
}

Однако, когда я публикую следующий Json (значение фамилии - строка вместо массива):

{
    "member1": {
        "firstName": "john",
        "lastNames": "wick"
    },
    "member2": {
        "firstName": "Rich"
    }
}

Я ожидаю получить объект Family с Member1 и Member2, имеющим только имя.

Но я получаю нулевое значение (в полученной модели не найдено семейство).

Следуеттакое поведение ожидать? и как сказать Newtonsoft игнорировать только фамилии вместо всей модели?

1 Ответ

0 голосов
/ 06 ноября 2019

Вам нужно написать свой собственный конвертер, чтобы игнорировать его. Решение:

Сначала объявите ваши собственные классы Resolver.

        class IgnoreNullList : DefaultContractResolver
        {
            protected override JsonContract CreateContract(Type objectType)
            {
                JsonContract contract = base.CreateContract(objectType);
                if (objectType == typeof(List<string>))
                {
                    contract.Converter = new MyNullIgnorer();
                }

                return contract;
            }
        }

    internal class MyNullIgnorer : JsonConverter
    {
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {

        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {

            if (reader.TokenType == JsonToken.StartArray)
            {
                JToken token = JToken.Load(reader);
                List<string> items = token.ToObject<List<string>>();
                return items;
            }

            return null;
        }

        public override bool CanConvert(Type objectType)
        {
            return true;
        }
    }

И в вашем коде конвертируйте ваш объект с помощью пользовательского конвертера.


....

            var setting = new JsonSerializerSettings()
            {
                ContractResolver = new IgnoreNullList()
            };

var test = JsonConvert.DeserializeObject<Family>(yourJsonString, setting);

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