假设我的ASP.NET Core(API)操作返回具有此属性的对象:
[WhatGoesHere("N")] // ?
public Guid MyGuid { get; set; }
它将被序列化为ffd76e47-609f-42bc-b6b8-b66dedab5561
。
我希望将其序列化为ffd76e47609f42bcb6b8b66dedab5561
。在代码为myGuid.ToString("N")
中。
是否可以使用属性来控制格式?
答案 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
}
}