2016-08-05 10 views
0

Was ist ein nützliches Modell, das ein Json-Objekt mit beliebigen Schlüsseln binden könnte? Angenommen, Ihre json könnte wie folgt aussehen:JSON-Modellbindung mit variablen Schlüsseln .net mvc4

{"@@hello": "address","#world": "address1","name": "address"} 

oder

{"@@hello": "address","#world": "address1","firstname": "foo", "lastname":"bar"} 

oder

{"@@hello": "address","#world": "address1","children": [{"name":"foo"},{"name":"bar"}]} 

Das heißt also, Sie nur zur Laufzeit wissen, wie das json Modell aussieht. Mein aktueller Status ist, dass es die beste Vorgehensweise ist, das Json-Objekt als String an den Controller zu senden und die JSON-Zeichenfolge zu einem Objekt zu deserialisieren.

public ActionResult mappingNodes(string model) { 
      dynamic json = Newtonsoft.Json.JsonConvert.DeserializeObject(model); 
} 
+0

Könnten Sie verwenden 'Dictionary '? Es ist natürlich nicht so schön wie ein Modell, aber ich denke, es wird ziemlich schwierig sein, die Eigenschaften einem Modell zuzuordnen. – Matthew

+0

@Matthew Das ist möglich, aber ich kann nicht den Vorteil sehen, mit Dictionary statt 'Newtonsoft.Json.JsonConvert.DeserializeObject'. – StellaMaris

+0

Sie könnten auch Ihre eigenen Vertragsauflösung schreiben, um zu bestimmen, wie Eigenschaften zu binden sind: http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_Serialization_DefaultContractResolver.htm – Matthew

Antwort

1
public class Children 
    { 
     [JsonProperty("name")] 
     public string Name { get; set; } 
    } 
    public class YourClass 
    { 
     [JsonProperty("@@hello")] 
     public string Hello { get; set; } 
     [JsonProperty("#world")] 
     public string World { get; set; } 
     [JsonProperty("name")] 
     public string Name { get; set; } 
     [JsonProperty("firstname")] 
     public string FirstName { get; set; } 
     [JsonProperty("lastname")] 
     public string LastName { get; set; } 
     [JsonProperty("children")] 
     public Children[] Children { get; set; } 
    } 



     var json1 = "{ '@@hello': 'address','#world': 'address1','name': 'address'}"; 
     var json2 = "{ '@@hello': 'address','#world': 'address1','name': 'address', 'firstname': 'foo', 'lastname':'bar'}"; 
     var json3 = "{ '@@hello': 'address','#world': 'address1','name': 'address','children': [{'name':'foo'},{'name':'bar'}]}"; 


     var model1 = JsonConvert.DeserializeObject<YourClass>(json1); 
     var model2 = JsonConvert.DeserializeObject<YourClass>(json2); 
     var model3 = JsonConvert.DeserializeObject<YourClass>(json3); 
+0

Dies funktioniert nicht mit einem meiner Json Beispiele und dort für Sie muss jedes Mal dein Modell ändern. – StellaMaris

+0

Es war eine kleine Version, wie es gemacht wird, jetzt ist es die Vollversion. Wenn Sie mehr Dynamik brauchen, müssen Sie vielleicht Reflektion oder andere Technik verwenden. Danke –

+0

Ich sehe in Ihrer Lösung keinen Unterschied zu meinem Vorschlag, das Objekt zu serialisieren. – StellaMaris