ASP.NET Core操作响应中的控件Guid格式

时间:2019-05-21 08:50:39

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

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

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

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

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

是否可以使用属性来控制格式?

3 个答案:

答案 0 :(得分:3)

您可以实现自定义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; }
}

答案 1 :(得分:3)

对于像您这样的简单场景,最简单的方法是拥有另一个属性,该属性通过使用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选项。希望对您有帮助

答案 2 :(得分:2)

基于@ r1verside的答案,这是我的实现:

import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';

@Injectable()
export class EventProxyService {

    private eventTracker = new BehaviorSubject<any>(undefined);

    getEvent(): BehaviorSubject<any> {
        return this.eventTracker;
    }

    setEvent(param: any): void {
        this.eventTracker.next(param);
    }
}

可以这样使用:

import { EventProxyService } from './eventProxy.service';

export class CommentComponent implements OnInit {
    constructor(private eventProxyService: EventProxyService) {}        

    public onSubmit() {
        //...
        this.reloadComment(true);
    }

    reloadComment(param: boolean): void {
        this.eventProxyService.setEvent(param);
    }
}

但格式可以覆盖:

import { EventProxyService } from './eventProxy.service';

export class ListComponent implements OnInit {

    subscription;

    constructor(private eventProxyService: EventProxyService) {}

    ngOnInit() {
        this.subscription = this.eventProxyService.getEvent().subscribe((param: any) => {
            this.listComment(param);
        });
    }

    // Multi value observables must manually unsubscribe to prevent memory leaks
    ngOnDestroy(): void {
        this.subscription.unsubscribe();
    }

    listComment(param) {
        //retrieve data from service
    }
}