Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann das Problem des JSON-Schleifenaufrufs in ASP.NET MVC gelöst werden?

Wie kann das Problem des JSON-Schleifenaufrufs in ASP.NET MVC gelöst werden?

零下一度
零下一度Original
2017-06-23 15:17:172011Durchsuche

1. Das Open-Source-Json-Serialisierungstool Newtonsoft.Json bietet eine Lösung für das Zirkelverweisproblem der Serialisierung:

Methode 1: Geben Sie die Json-Serialisierungskonfiguration als ReferenceLoopHandling.Ignore an

Methode 2: Geben Sie JsonIgnore an, um das Referenzobjekt zu ignorieren.

Beispiel 1: Lösen Sie die Json-Serialisierungsreferenzmethode von MVC:

Schritt 1: Fügen Sie einen Verweis auf Newtonsoft.Json hinzu Paket für das Projekt, Befehl: Insert-Package Newtonsoft.Json

Schritt 2: Fügen Sie dem Projekt eine Klasse hinzu und erben Sie JsonResult. Der Code lautet wie folgt:

Wie kann das Problem des JSON-Schleifenaufrufs in ASP.NET MVC gelöst werden?
/// <summary>/// 继承JsonResut,重写序列化方式/// </summary>public class JsonNetResult : JsonResult
{public JsonSerializerSettings Settings { get; private set; }public JsonNetResult()
    {
        Settings = new JsonSerializerSettings
        {//这句是解决问题的关键,也就是json.net官方给出的解决配置选项.                 
            ReferenceLoopHandling = ReferenceLoopHandling.Ignore
        };
    }public override void ExecuteResult(ControllerContext context)
    {if (context == null)throw new ArgumentNullException("context");if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet && string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))throw new InvalidOperationException("JSON GET is not allowed");
        HttpResponseBase response = context.HttpContext.Response;
        response.ContentType = string.IsNullOrEmpty(this.ContentType) ? "application/json" : this.ContentType;if (this.ContentEncoding != null)
            response.ContentEncoding = this.ContentEncoding;if (this.Data == null)return;var scriptSerializer = JsonSerializer.Create(this.Settings);using (var sw = new StringWriter())
        {
            scriptSerializer.Serialize(sw, this.Data);
            response.Write(sw.ToString());
        }
    }
}
Wie kann das Problem des JSON-Schleifenaufrufs in ASP.NET MVC gelöst werden?

Schritt 3: BaseController zum Projekt hinzufügen und neu schreiben Bei der Json()-Methode lautet der Code wie folgt:

Wie kann das Problem des JSON-Schleifenaufrufs in ASP.NET MVC gelöst werden?
public class BaseController : Controller
{public StudentContext _Context = new StudentContext();/// <summary>/// 重写,Json方法,使之返回JsonNetResult类型/// </summary>protected override JsonResult Json(object data, string contentType,
        Encoding contentEncoding, JsonRequestBehavior behavior)
    {return new JsonNetResult
        {
            Data = data,
            ContentType = contentType,
            ContentEncoding = contentEncoding,
            JsonRequestBehavior = behavior
        };
    }
}
Wie kann das Problem des JSON-Schleifenaufrufs in ASP.NET MVC gelöst werden?

Schritt 4. Einfach wie gewohnt verwenden

Wie kann das Problem des JSON-Schleifenaufrufs in ASP.NET MVC gelöst werden?
//获取列表public JsonResult GetList()
{
    List<student> list = _Context.students.Where(q => q.sno == "103").ToList();//方法1return Json(list);//方法2//return new JsonNetResult() {//    Data=list//};
}</student>
Wie kann das Problem des JSON-Schleifenaufrufs in ASP.NET MVC gelöst werden?

Die erhaltenen Ergebnisse zeigen, dass diese Methode angibt, Zirkelverweise zu ignorieren. Wird sie nach der Angabe des Zyklus ignoriert? Serie? In den zurückgegebenen JSON-Daten oder Es gibt einige zirkuläre Daten

Um die EF Json-Serialisierungs-Zirkelreferenzmethode 2 zu lösen, fügen Sie die Annotation der JsonIgnore-Methode hinzu für das angegebene zugehörige Objekt

[JsonIgnore]public virtual ICollection<score> scores { get; set; }</score>

Die zurückgegebenen Ergebnisse enthalten keine zugehörigen Tabellendaten


Der Artikel ist reproduziert von:

Das obige ist der detaillierte Inhalt vonWie kann das Problem des JSON-Schleifenaufrufs in ASP.NET MVC gelöst werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn