.NET-Web-API-Probleme mit der Deserialisierung von JSON-Objekt
Überholte ich ein Projekt wurde entwickelt von einer Firma, die für uns, leider haben wir nicht bekommen, viel Unterstützung und langfristig, wir sollten erreichen, Pflege und Wartung der von uns für Sie. Die Anwendung besteht aus einem einfachen Web-client (HTTP, JavaScript, Knockout-Framework) und einer REST-API Service (.NET 4.5, ASP.NET MVC denke ich).
Derzeit bin ich nur Sie der AUFTRAGGEBER, so sollte der Server weiterhin wie erwartet funktionieren.
Auf dem clientseitiger ich veränderte die Ko-View-Modell ein wenig (zugegeben einige computables und optimierte Darstellung von Werten). Ein View-Modell besteht aus "Fragen" und "Kommentare" (wie ein array über Fragen, es ist ein Bug-tracker in der Tat). Wenn ich ein neues Problem, die Beschreibung ist Hinzugefügt, um einen ersten Kommentar, das ganze Modell ist JSON.stringified und die senden die .NET-API-Service. Ich bewährten mit Firebug, dass das JSON-das wird geschrieben die wie folgt aussieht:
{
"Id":0,
"Title":"THis is a title",
"Comments":[
{
"Id":1,
"Text":"this is the first comment"
}
]
}
Auf der client-Seite habe ich ein "IssueController":
[HttpPost]
public HttpResponseMessage PostIssues( Issue issue ) {
//issue should already hold the deserialized content of the JSON here,
//but it only contains 'Id' and 'Title' not the 'Comments' (empty List)
...
}
Dem Problem domain model-Objekt hat auch ein array für die Abhaltung Kommentare, aber an diesem Ende seiner bereits leer. Die .NET-code nicht irgendeinen Teil, die explizit analysiert, JSON, soweit ich es verstanden habe, das MVC-Framework wird implizit von gleichen Namen für die Eigenschaft (Ist das richtig?).
Die Deserialisierung bereits gearbeitet als erwartet, so die .NET-Code sollte in Ordnung sein, aber ich sieht, dass ich geändert haben, dass das JSON in einer Weise, dass dieses implizite Zuordnung der Kommentare funktioniert nicht mehr. Leider habe ich nicht viel Erfahrungen mit dem .NET MVC-Framework (oder ist es nur das .NET WebAPI Rahmen, kann Ihnen sogar sagen, dass).
Das sind meine Fragen:
- Welche Art von .NETTO-REST-API-Framework ist das? Wie kann ich unterscheiden?
- Wie ist das implizite Deserialisierung von JSON zu arbeiten, und was sind Ihre Tücken, zum Beispiel wenn Teile der JSON nicht deserialisiert werden, wie erwartet? Vor allem auf der client-Seite (wie gesagt, ich wusste nicht, ändern Sie den server-code)
- Irgendwelche Ideen, was ich getan haben könnte, um die JSON der server mag es nicht mehr? 😉
BEARBEITEN
Problem.cs sieht wie folgt aus (vereinfacht sicher):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Bo;
using Projects.DomainObjects;
namespace Projects.Models {
public class Issue : DomainObject {
public Issue() {
this.Comments = new List<Comment>();
}
public long Id { get; set; }
private string _Title;
public string Title { get { return _Title; } set { _Title = value; NotifyChanged(); } }
public List<Comment> Comments { get; set; }
}
Kommentar.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Common;
using Projects.DomainObjects;
namespace Projects.Models {
public class Comment : DomainObject {
public Comment() {
}
public long Id { get; set; }
public string Text { get; set; }
}
- Könntest du die Daten-Klassen, wie PostIssues? (Alles, was mit "Id","Text","Kommentare { "Id", "Text"}
- Ist Kommentare definierte Eigenschaft in der Klasse "DomainObject"?
- "DomainObject" ist eine abstrakte Klasse, die nur definieren einige wirklich grundlegende Verhaltensweisen, die für das Domain-Model-Klassen. Nichts Interessantes drin, denke ich, außer Sie sagen mir, was ich suchen soll.
- Sie wusste nicht, definieren Sie eine Anmerkung Eigenschaft des Feldes.
- Sorry, du hast Recht, war ein Tippfehler aufgrund der übersetzung Deutsch code - > Englisch 😉 korrigiert es
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe gerade versucht deinen code direkt aus deinem post und es funktionierte für mich.
Also es gibt ein paar Dinge, die möglicherweise schief auf Ihrer Seite:
data: ko.toJSON(issue)
und nicht nurdata: issue
.content-type: application/json
Sind hier die Antworten zu deinen anderen Fragen:
, Welche Art von .NETTO-REST-API-Framework ist das? Wie kann ich unterscheiden?
Das sieht nicht aus wie etwas Brauch (zumindest, was du gepostet hast), ist es eben gerade die Web-API .NET.
Wie ist das implizite Deserialisierung von JSON zu arbeiten, und was sind Ihre Tücken, zum Beispiel wenn Teile der JSON nicht deserialisiert werden, wie erwartet? Vor allem auf der client-Seite (wie gesagt, ich wusste nicht, ändern Sie den server-code)
Deserialisierung auf dem server verwendet die Sammlung von Formatierungen, die auf der Grundlage der
content-type
vom client. Das kann Komplex sein, wenn Sie wollen, um es anzupassen, aber es gibt Informationen hierIrgendwelche Ideen, was ich getan haben könnte, um die JSON der server mag es nicht mehr? 😉
Als ich sagte, dass Ihr code funktionierte für mich!
var i = JSON.parse(ko.toJSON(issue));
(ich denke mal irgendeine Art von Validierung der resultierende JSON). Dann wird der ursprüngliche Programmierer hat einedata: ko.toJS(i)
übergeben die Daten an ajax-post-Funktion. In Firebug habe ich auch überprüft, dass der content-type ist application/json. Dann habe ichko.toJSON(issue)
wie Sie vorgeschlagen, der daraus resultierende Beitrag war der gleiche, aber auf der server-Seite das Problem-Objekt ist noch deserialisiert ohne die Kommentare.Gelöst, das Problem war eine berechnete, dass gibt ein sortiertes array mit den Kommentaren. Also mein knockout-Modell enthält eine
und ein
So, wenn ich das serialisieren dieses Modell, die geposteten JSON repräsentiert nun die
Comments
Array, aber auch dieCommentsSorted
Array. Nur wenn ichbevor ich post
i
als Daten .NET ist in der Lage, zu DeserialisierenComments
richtig.Den mysteriösen Sache über dieses ist, dass es immer andere berechnete Felder in meinem knockout-Modell, das zu bekommen komplett ignoriert, durch .NET und nicht stören Deserialisierung in keiner Weise. Es scheint also, dass es kommt vor allem auf den Namen und den Typ der Felder im Modell (vielleicht, wenn die ersten Buchstaben gleich sind?).
Das gute daran: es funktioniert jetzt
Das schlechte daran: es ist nicht wirklich deterministisch wie .NET funktioniert die Deserialisierung von JSON-Daten und ich bin auch nicht in der Lage zu Debuggen, wenn es sich nicht so verhält wie erwartet.