2016-08-01 18 views
4

Ich versuche, JSON mit Punkten in den Eigenschaftsnamen in einem Schlüsselwertformat zu deserialisieren. Ich verwende die integrierte ASP.NET MVC-Modellbindung. Es scheint, die Punkte als Objektnotation statt nur als Schlüsselwertobjekt zu interpretieren. Gibt es eine Möglichkeit, es als Schlüsselwert korrekt zu deserialisieren, die Punkte zu ignorieren? Dies ist wichtig, da die Daten in diesem Format erneut ausgegeben werden müssen.Deserialisieren von JSON mit Punkt in Eigenschaftsname

Controller Aktion

[HttpPost] 
public ActionResult SaveProgress(int id, ProgressVM data) 
{ 
    // ProgressVM Data property has an item with key "prop" and a null value, nothing else 
} 

Ansicht Modell

public class ProgressVM 
{ 
    public int ID { get; set; } 
    public Dictionary<string, string> Data { get; set; } 
} 

JSON Beispiel

{ 
    "ID": 123, 
    "Data": { 
     "prop.0.name": "value", 
     "prop.0.id": "value", 
     "prop.1.name": "value", 
     "prop.2.name": "value", 
     "prop.3.name": "value" 
    } 
} 
+0

Wo gibt es Ihnen das Problem? Senden der Daten ckuent-Server oder umgekehrt? –

+0

Senden der Daten vom Client zum Server, Deserialisierung in der Aktionsmethode. –

+0

Was wäre, wenn anstelle von Punkten Kommas, Bindestriche oder Semikolons verwendet würden? –

Antwort

3

Vor allem, wenn die Parameter in einer POST Aktion vorbei, übergeben Sie nur einen Parameter und nicht mehrere. Versuchen Sie also, ein Modell zu erstellen, in dem die ID und das ProgressVM-Modell enthalten sind.

Jetzt für das Problem mit der Deserialisierung. Etwas scheint mit der Klasse JsonValueProviderFactory falsch zu sein, da es das verschachtelte Modell Dictionary<string, string> von ProgressVM nicht bindet. Ich weiß, weil ich versucht habe, eine ModelBinder für dieses Modell zu erstellen, aber es schlägt auf DictionaryValueProvider fehl, die Data Eigenschaft nicht bindend. Leider habe ich nicht gesucht, warum das passiert, ist es ein Fehler auf JsonValueProviderFactory? Ich weiß es nicht, also ging ich schnell zu einem anderen Workaround.

Warum versuchen Sie nicht, die JSON-Zeichenfolge an den Controller anstelle des Modells zu geben, und dann im Körper des Controllers deserialize die Eingabe? Betrachten Sie das folgende Beispiel:

JavaScript-Code, jQuery AJAX unter Verwendung von Daten Aktion

var data = { 
    "ID": 123, 
    "Data": { 
     "prop.0.name": "value", 
     "prop.0.id": "value", 
     "prop.1.name": "value", 
     "prop.2.name": "value", 
     "prop.3.name": "value" 
    } 
}; 

$.ajax({ 
    url: '@Url.Action("SaveProgress", "Home")', 
    data: { "data": JSON.stringify(data) }, 
    method: "POST" 
}); 

ASP.NET MVC-Controller

[HttpPost] 
public ActionResult SaveProgress(string data) 
{ 
    var json = JsonConvert.DeserializeObject<ProgressVM>(data); 
    // Rest of code here 
} 

zu schreiben Ist dies Ihre Frage zu beantworten?

+0

Danke, dass du all das testest, anscheinend bekommst du ähnliche Ergebnisse zu mir. Das JSON als String zu übergeben und in der Aktion zu deserialisieren funktioniert definitiv viel besser. –

+1

Was passiert, wenn die Antwort, die wir erhalten, einen Punkt im Eigenschaftsnamen hat? – Saket

Verwandte Themen