【问题标题】:Control Guid format in ASP.NET Core action's responseASP.NET Core 操作响应中的控制 Guid 格式
【发布时间】:2019-10-07 15:04:29
【问题描述】:

假设我的 ASP.NET Core (API) 操作返回具有此属性的对象:

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

它将被序列化为ffd76e47-609f-42bc-b6b8-b66dedab5561。

我希望它被序列化为ffd76e47609f42bcb6b8b66dedab5561。在 myGuid.ToString("N") 的代码中。

有没有可以用来控制格式的属性?

【问题讨论】:

  • 您可以将您的 '-' 值替换为 '' 并根据您的要求获得字符串。
  • @A.M.Patel 我认为你没有抓住重点。 OP 希望这会自动发生。

标签: c# asp.net-core json.net asp.net-core-2.2


【解决方案1】:

您可以实现自定义 JsonConverter see here。并配置您的 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】:

对于像您这样的简单场景,最简单的方法是使用另一个属性来格式化MyGuid,使用MyGuid.ToString("N")。其中“N”表示您只需要没有“-”的数字。请看documentation

您可以将[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

对于更复杂的场景,您当然可以使用@r1verside 提到的自定义 JsonConverter 选项。我希望这会有所帮助

【讨论】:

  • 有趣的想法,不需要实现转换器...谢谢!
【解决方案3】:

根据@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; }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 2021-10-09
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多