Ho una classe di entità con una relazione genitore-figlio che ha problemi di serializzazione a json usando newtonsoft json.net
public class Department
{
[Key]
public int DepartmentId { get; set; }
public int? ParentId { get; set; }
public Department Parent { get; set; }
public ICollection<Department> Children { get; set; }
public string Title { get; set; }
}
Mentre mi aspetto un formato JSON come questo.
[
{
"departmentId": 1,
"title": "Finance",
"children": [
{
"departmentId": 2,
"title": "Accounting",
"children": [
{
"departmentId": 3,
"title": "Payable"
}
]
}
]
}
]
Ma il risultato ottengo questa eccezione Stackoverflow da http-repl
Sto cercando di utilizzare Ignore ReferenceLooping, questo non risolve il problema StackOverflow che ho
services.AddMvc()
.AddJsonOptions(options => {
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
})
Ecco il Controller, se lo chiedi;
//GET: api/Department
[HttpGet]
public async Task<ActionResult<IEnumerable<Department>>> GetDepartments()
{
var result = await _context.Departments
.Include(department => department.Children)
.Where(department => department.ParentId == null)
.ToListAsync();
return Ok(result);
}
Ho provato che Data Transfer Object (DTO) non funziona ancora.
Lascia che sia impostato correttamente, puoi clonare il progetto base su https://github.com/wangkanai/Organization/tree/base . Quindi è possibile aggiungere il database nel seguente percorso src\Organization.WebApi
dotnet ef migrations add init
dotnet ef database update
Questo ti darà i dati di seed per il Dipartimento con i seguenti dati
Dai dati seme, il bambino massimo avremo solo 3 livelli di profondità e nessun cerchio verrà rilasciato come loop infinito.
Quindi non vediamo A> B> Un ciclo infinito qui in questi dati seme.
Dopodiché possiamo eseguire il debug usando dotnet-httprepl e dovremmo ottenere gli stessi risultati.
Ora consente di commentare tutti i metodi nel controller di reparto per limitare l'ambito dell'errore. Quindi otteniamo il http-repl attivo e funzionante.
Quindi permettiamo solo di ottenere tutti i reparti e vedere quale struttura dell'entità ritorna;
Ma questo produce errore di serializzazione JSON per http-repl, forse da swagger ui json http://localhost:56739/swagger/v1/swagger.json
Aggiungiamo \[JsonIgnore\]
al sito e al genitore, quindi \[JsonIgnore\]
nuovo il http-repl
public class Department
{
[Key]
public int DepartmentId { get; set; }
[JsonIgnore]
public int SiteId { get; set; }
[JsonIgnore]
public Site Site { get; set; }
[JsonIgnore]
public int? ParentId { get; set; }
[JsonIgnore]
public Department Parent { get; set; }
public ICollection<Department> Children { get; set; }
public string Title { get; set; }
}
Tuttavia produce lo stesso errore
Quindi ora lascia Ignora tutta la relazione per serializzare json per vedere se possiamo ottenere tutti i reparti. Ma questo produce dipartimenti senza i suoi figli, il che non è che ci aspettiamo i risultati corretti.
public class Department
{
[Key]
public int DepartmentId { get; set; }
[JsonIgnore]
public int SiteId { get; set; }
[JsonIgnore]
public Site Site { get; set; }
[JsonIgnore]
public int? ParentId { get; set; }
[JsonIgnore]
public Department Parent { get; set; }
[JsonIgnore]
public ICollection<Department> Children { get; set; }
public string Title { get; set; }
}
Non penso che sia necessario convertire DTO solo per ottenere il formato JSON, dato che ho il primo modello EF Code che posso vedere
public class Department
{
[Key]
public int DepartmentId { get; set; }
public int? ParentId { get; set; }
public Department Parent { get; set; }
public ICollection<Department> Children { get; set; }
public string Title { get; set; }
}
È possibile restituire direttamente l'output di JSON come segue dal controller di azione.
public class JsonDemoController : Controller
{
#region ActionControllers
/// <summary>
/// Get department data in Json Format
/// </summary>
/// <returns></returns>
public JsonResult GetDepartmentJsonData()
{
var departments= GetDepartments();
return Json(departments, JsonRequestBehavior.AllowGet);
}
private List<Department> GetDepartments()
{
var departmentList = new List<Department>
{
new Department
{
DepartmentId = 1,
Title = "Finance",
Children = childrenCollection
}
};
return departmentList;
}
}
Non ho ancora provato IDE per farmi sapere se c'è qualche problema sul codice.