我有包括作者在內的書籍類,我的作者類也包括書籍。因此,當我嘗試將 book 轉換為 json 字串時,它會給出參考回圈錯誤。所以我這樣做
public IHttpActionResult GetAllForOfficer()
{
Library library = _libraryManager.GetById(ProviderAuthorization.libraryId);
List<Book> books = _bookManager.GetAll().Where(x=>x.Libraries.Contains(library)).ToList();
return Ok(JsonConvert.SerializeObject(books, Formatting.Indented,
new JsonSerializerSettings()
{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
}));
}
這會回傳這樣的輸出
"[\r\n {\r\n \"Authors\": [\r\n {\r\n \"Books\": [],\r\n \"Id\": 4,\r\n \"Name\": \"Texe Marrs\"\r\n }\r\n ],\r\n \"Categories\": [],\r\n \"Comments\": [],\r\n \"Libraries\": [\r\n {\r\n \"Books\": [\r\n {\r\n \"Authors\": [\r\n {\r\n \"Books\": [\r\n {\r\n \"Authors\": [],\r\n \"Categories\": [\r\n {\r\n \"Books\": [],\r\n \"Id\": 5,\r\n \"Name\": \"dede\",\r\n \"ClickCounter\": 0\r\n },\r\n {\r\n \"Books\": [],\r\n \"Id\": 6,\r\n \"Name\": \"asas\",\r\n \"ClickCounter\": 0\r\n }\r\n ],\r\n \"Comments\": [\r\n {\r\n \"User\": {\r\n \"Comments\": [],\r\n
我有這樣的書課
public int Id { get; set; }
[Required]
[StringLength(10)]
public string ISBN10 { get; set; }
[Required]
[StringLength(13)]
public string ISBN13 { get; set; }
[Required]
public string Name { get; set; }
[Required]
public string Publisher { get; set; }
public int? NumberOfPages { get; set; }
public int? Revision { get; set; }
public int? LatestRevision { get; set; }
[StringLength(50)]
public string Language { get; set; }
[Column(TypeName = "date")]
public DateTime? CreateDate { get; set; }
public string Description { get; set; }
[Column(TypeName = "image")]
public byte[] Image { get; set; }
public int ClickCounter { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Comment> Comments { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<UserBook> UserBooks { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Author> Authors { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Category> Categories { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Library> Libraries { get; set; }
我的輸出看起來有點奇怪。它應該像 "Authors":["Name":"Pete Mark"]。但是有一些反斜杠。我想我在將類轉換為 json 時遇到問題。我該如何解決?
uj5u.com熱心網友回復:
您不需要任何特殊的轉換,net 會為您完成。如果你試圖讓 json 看起來很漂亮,它在服務器端沒有任何意義。在此之后,您將不得不在客戶端反序列化或決議它。
public IHttpActionResult GetAllForOfficer()
{
Library library = _libraryManager.GetById(ProviderAuthorization.libraryId);
List<Book> books = _bookManager.GetAll().Where(x=>x.Libraries.Contains(library)).ToList();
return Ok(books);
}
uj5u.com熱心網友回復:
解決問題的一種快速方法是將[JsonIgnore]屬性添加到類中的 Authors、Category 和 Libraries 屬性Book(以及其他類中可能的一些其他屬性)。
更好的方法是為這些屬性撰寫自定義 JsonConverters。例如,Book該類可以使用 a在序列化時AuthorNameConverter將Author物件轉換為string帶有作者姓名的a 。您可以將該轉換器添加為屬性的Authors屬性,或將其添加到 JsonSerializerSettings 的可用轉換器中。
您可以在此處找到 JsonConverter 的示例:https ://www.newtonsoft.com/json/help/html/CustomJsonConverter.htm
將其添加為屬性:
[JsonProperty(ItemConverterType = typeof(AuthorNameConverter))]
public virtual ICollection<Author> Authors { get; set; }
uj5u.com熱心網友回復:
感謝所有說我實際上不需要任何轉換的人。我使用資料傳輸物件解決了這個問題。我創建了相同的課程。并通過不均衡子類的關系物件(型別為 ICollection)將其轉換為 dto。
這是我的書物體。
public int Id { get; set; }
[Required]
[StringLength(10)]
public string ISBN10 { get; set; }
[Required]
[StringLength(13)]
public string ISBN13 { get; set; }
[Required]
public string Name { get; set; }
[Required]
public string Publisher { get; set; }
public int? NumberOfPages { get; set; }
public int? Revision { get; set; }
public int? LatestRevision { get; set; }
[StringLength(50)]
public string Language { get; set; }
[Column(TypeName = "date")]
public DateTime? CreateDate { get; set; }
public string Description { get; set; }
[Column(TypeName = "image")]
public byte[] Image { get; set; }
public int ClickCounter { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Comment> Comments { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<UserBook> UserBooks { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Author> Authors { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Category> Categories { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Library> Libraries { get; set; }
這是 BookDto 類。
public int Id { get; set; }
public string ISBN10 { get; set; }
public string ISBN13 { get; set; }
public string Name { get; set; }
public string Publisher { get; set; }
public int? NumberOfPages { get; set; }
public int? Revision { get; set; }
public int? LatestRevision { get; set; }
public string Language { get; set; }
public DateTime? CreateDate { get; set; }
public string Description { get; set; }
public byte[] Image { get; set; }
public int ClickCounter { get; set; }
public List<CommentDto> Comments { get; set; }
public List<UserBookDto> UserBooks { get; set; }
public List<AuthorDto> Authors { get; set; }
public List<CategoryDto> Categories { get; set; }
public List<LibraryDto> Libraries { get; set; }
我有我的行動。
public IHttpActionResult GetAllForOfficer()
{
Library library = _libraryManager.GetById(ProviderAuthorization.libraryId);
List<BookDto> booksDto = _bookManager.GetAll().Where(x => x.Libraries.Contains(library)).ToList().ConvertAll<BookDto>(x => new BookDto()
{
Id = x.Id,
Name = x.Name,
ISBN10 = x.ISBN10,
ISBN13 = x.ISBN13,
Authors = x.Authors.ToList().ConvertAll<AuthorDto>(y => new AuthorDto() { Id = y.Id, Name = y.Name }),
Categories = x.Categories.ToList().ConvertAll<CategoryDto>(y => new CategoryDto() { Id = y.Id, Name = y.Name, ClickCounter = y.ClickCounter }),
Comments = x.Comments.ToList().ConvertAll<CommentDto>(y => new CommentDto() { Id = y.Id, BookId = y.BookId, CommentString = y.Comment1, Date = y.Date, Status = y.Status, UserId = y.UserId }),
Libraries = x.Libraries.ToList().ConvertAll<LibraryDto>(y => new LibraryDto() { Id = y.Id, Address = y.Address, Location = y.Location, Name = y.Name, Status = y.Status }),
UserBooks = x.UserBooks.ToList().ConvertAll<UserBookDto>(y => new UserBookDto() { Id = y.Id, Status = y.Status, BookId = y.BookId, BorrowDate = y.BorrowDate, LibraryId = y.LibraryId, UserId = y.UserId, ReturnDate = y.ReturnDate }),
ClickCounter = x.ClickCounter,
CreateDate = x.CreateDate,
Description = x.Description,
Image = x.Image,
Language = x.Language,
LatestRevision = x.LatestRevision,
NumberOfPages = x.NumberOfPages,
Publisher = x.Publisher,
Revision = x.Revision,
});
return Ok(booksDto);
}
現在我有 Postman 的輸出是這樣的。
{
"Id": 1,
"ISBN10": "123123",
"ISBN13": "213123",
"Name": "asdasd",
"Publisher": "asdasd",
"NumberOfPages": 2,
"Revision": 2,
"LatestRevision": 2,
"Language": "asd",
"CreateDate": "1010-10-10T00:00:00",
"Description": "asdasd",
"Image": null,
"ClickCounter": 0,
"Comments": [
{
"Id": 3,
"UserId": 1,
"BookId": 1,
"CommentString": "TestComment",
"Date": "2020-10-10T00:00:00",
"Status": 1,
"Book": null,
"User": null
}
],
"UserBooks": [
{
"Id": 2,
"UserId": 1,
"BookId": 1,
"LibraryId": 1,
"BorrowDate": "1010-10-10T00:00:00",
"ReturnDate": null,
"Status": 1,
"Book": null,
"Library": null,
"User": null
}
],
"Authors": [
{
"Id": 1,
"Name": "TestAuthor1",
"Books": null
},
{
"Id": 2,
"Name": "TestAuthor2",
"Books": null
}
],
"Categories": [
{
"Id": 5,
"Name": "TestCategory0",
"ClickCounter": 0,
"Books": null
},
{
"Id": 6,
"Name": "TestCategory1",
"ClickCounter": 0,
"Books": null
}
],
"Libraries": [
{
"Id": 1,
"Name": "asdasd",
"Address": "asdasd",
"Location": "asdasd",
"Status": 1,
"Officers": null,
"UserBooks": null,
"Books": null,
"Users": null
},
{
"Id": 2,
"Name": "asdasd",
"Address": "asdasd",
"Location": "asdasd",
"Status": 2,
"Officers": null,
"UserBooks": null,
"Books": null,
"Users": null
}
]
}
不使用 dto 類也可以解決問題。像那樣
public IHttpActionResult GetAllForOfficer()
{
Library library = _libraryManager.GetById(ProviderAuthorization.libraryId);
List<BookDto> booksDto = _bookManager.GetAll().Where(x => x.Libraries.Contains(library)).ToList().ConvertAll<BookDto>(x => new Book()
{
Id = x.Id,
Name = x.Name,
ISBN10 = x.ISBN10,
ISBN13 = x.ISBN13,
Authors = x.Authors.ToList().ConvertAll<Author>(y => new Author() { Id = y.Id, Name = y.Name }),
Categories = x.Categories.ToList().ConvertAll<Category>(y => new Category() { Id = y.Id, Name = y.Name, ClickCounter = y.ClickCounter }),
Comments = x.Comments.ToList().ConvertAll<Comment>(y => new Comment() { Id = y.Id, BookId = y.BookId, Comment1 = y.Comment1, Date = y.Date, Status = y.Status, UserId = y.UserId }),
Libraries = x.Libraries.ToList().ConvertAll<Library>(y => new Library() { Id = y.Id, Address = y.Address, Location = y.Location, Name = y.Name, Status = y.Status }),
UserBooks = x.UserBooks.ToList().ConvertAll<UserBook>(y => new UserBook() { Id = y.Id, Status = y.Status, BookId = y.BookId, BorrowDate = y.BorrowDate, LibraryId = y.LibraryId, UserId = y.UserId, ReturnDate = y.ReturnDate }),
ClickCounter = x.ClickCounter,
CreateDate = x.CreateDate,
Description = x.Description,
Image = x.Image,
Language = x.Language,
LatestRevision = x.LatestRevision,
NumberOfPages = x.NumberOfPages,
Publisher = x.Publisher,
Revision = x.Revision,
});
return Ok(booksDto);
}
但是在轉換 ICollection 物件時會出現問題。我將 ICollection 轉換為串列以使用 ConvertAll 方法。但最后我必須將其更改為 ICollection。所以最后一個代碼示例不起作用。也許有辦法,但我沒有搜索它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/408234.html
標籤:
