Управляющий формат Guid в ответе действия ASP.NET Core - PullRequest
2 голосов
/ 21 мая 2019

Предположим, что мое действие ASP.NET Core (API) возвращает объект со следующим свойством:

[WhatGoesHere("N")]                  // ?
public Guid MyGuid { get; set; }

Он будет сериализован как ffd76e47-609f-42bc-b6b8-b66dedab5561.

Я хочу, чтобы он был сериализован.как ffd76e47609f42bcb6b8b66dedab5561.В коде это будет myGuid.ToString("N").

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

Ответы [ 3 ]

3 голосов
/ 21 мая 2019

Для простого сценария, подобного вашему, самый простой способ сделать это - иметь другое свойство, которое форматирует MyGuid с помощью MyGuid.ToString("N").Где «N» означает, что вам просто нужны цифры без «-».Пожалуйста, смотрите документацию

. Вы можете добавить [JsonIgnore] к MyGuid и добавить атрибут [JsonProperty("MyGuid")] к другому свойству:

public class MyClass
{
    [JsonIgnore]
    public Guid MyGuid { get;set; }

    [JsonProperty("MyGuid")]
    public string DisplayGuid => MyGuid.ToString("N");
}

С помощью вышеупомянутогона месте, свойство MyGuid будет игнорироваться.Вместо этого свойство DisplayGuid будет возвращено с именем MyGuid со значением ffd76e47609f42bcb6b8b66dedab5561

. Для более сложных сценариев вы, безусловно, можете выбрать пользовательский параметр JsonConverter, как упомянуто @ r1verside.Я надеюсь, что это поможет

3 голосов
/ 21 мая 2019

Вы можете реализовать пользовательский JsonConverter , см. Здесь . И настройте ваше основное приложение aspnet, чтобы зарегистрировать этот JsonConverter для форматирования вывода. Таким образом, каждый раз, когда ваше приложение будет сериализовать Guid в JSON, вы получите то, что вам нужно:

public void ConfigureServices(IServiceCollection services)
{
    services
        .AddMvc()
        .AddJsonOptions(options => {
            options.SerializerSettings.Converters.Add(new MyCustomConverter());
    });
}

Вы также можете выбрать некоторые конкретные классы, чтобы использовать конвертер вместо всех них, используя этот атрибут поверх него:

[JsonConverter(typeof(MyCustomConverter))]
public class MyClass
{
    public Guid MyGuid { get;set; }
}
2 голосов
/ 21 мая 2019

Основываясь на ответе @ r1verside, вот моя реализация:

using System;

namespace MyProject {

  public sealed class GuidConverter : JsonConverter<Guid> {

    public GuidConverter() { }

    public GuidConverter(string format) { _format = format; }

    private readonly string _format = "N";

    public override void WriteJson(JsonWriter writer, Guid value, JsonSerializer serializer) {
      writer.WriteValue(value.ToString(_format));
    }

    public override Guid ReadJson(JsonReader reader, Type objectType, Guid existingValue, bool hasExistingValue, JsonSerializer serializer) {
      string s = (string)reader.Value;
      return new Guid(s);
    }

  }
}

Может использоваться следующим образом:

[JsonConverter(typeof(GuidConverter))]    // defaults to format of "N"
public Guid MyGuid { get; set; }

, но формат может быть переопределен:

[JsonConverter(typeof(GuidConverter), "X")]
public Guid MyGuid { get; set; }
...