2016-04-29 5 views
0

Ich bin enthält versucht, diese json neu zu erstellen:Fehler, wenn ein JObject schaffen, die ein Array

{ 
    "auth": { 
     "identity": { 
      "methods": [ 
       "password" 
      ], 
      "password": { 
       "user": { 
        "id": "90551bd1bcf6474dba09c96617a33638", 
        "password": "hoeIX1.i-.M]wiu9" 
       } 
      } 
     }, 
     "scope": { 
      "project": { 
       "id": "2440e4fa1725452cb2e14506cb5d63ec" 
      } 
     } 
    } 
} 

Im Moment bin ich dies zu tun:

JObject auth = new JObject(
    new JProperty("auth", new JObject(
     new JProperty("identity", new JObject(
      new JProperty("method",JArray.Parse("[\"password\"]")), 
      new JProperty("password", new JObject(
       new JProperty("user", new JObject(
        new JProperty("id", JValue.CreateString(identityWithProject.Username)), 
        new JProperty("password", JValue.CreateString(identityWithProject.ProjectName))))))), 
     new JProperty("scope", new JObject(
      new JProperty("project", new JObject(
       new JProperty("id", JValue.CreateString(identityWithProject.ProjectName)))))))))); 

ich diesen Fehler:

"Can not add Newtonsoft.Json.Linq.JProperty to Newtonsoft.Json.Linq.JArray."

Die Linie, die nicht funktioniert ist:

new JProperty("method",JArray.Parse("[\"password\"]")) 

Wenn ich den JArray Teil entferne funktioniert es gut, wie könnte ich es reparieren, so dass es mit dem Array Teil funktioniert? Die meisten Beispiele, die ich gefunden habe, sind ein Array von JObjects, was nicht der Fall ist. Danke!

+2

Dies ist ein Fall, in dem Sie stark von der Verwendung einer Klasse mit den Eigenschaften profitieren würden Sie die Notwendigkeit und Serialisierung Klasse, um den JSON zurückzugeben. Obwohl Sie es so machen können wie Sie sind, ist es nicht lesbar und wird im Falle von Fehlern viel schwieriger zu debuggen sein. Abgesehen davon können Sie neue JProperty verwenden ("Methode", neues JArray (neues {"Passwort"})). –

+0

Ich habe nicht einmal darüber nachgedacht, ich werde es versuchen – moondaisy

Antwort

3

Es sieht aus wie es ein verlegtes ) ist, das funktioniert:

var auth = new JObject(
    new JProperty("auth", new JObject(
     new JProperty("identity", new JObject(
      new JProperty("methods", JArray.Parse("[\"password\"]")), 
      new JProperty("password", new JObject(
       new JProperty("user", new JObject(
        new JProperty("id", JValue.CreateString(identityWithProject.Username)), 
        new JProperty("password", JValue.CreateString(identityWithProject.ProjectName)))))))), // 8 x ')' 
     new JProperty("scope", new JObject(
      new JProperty("project", new JObject(
       new JProperty("id", JValue.CreateString(identityWithProject.ProjectName))))))))); // 9 x ')' 

Ich zog eine ) von der letzten Zeile auf der drittletzten Zeile.

Auch die Eigenschaft "method" sollte "methods" benannt werden, wenn es Ihre Probe mach. Außerdem gibt es keinen Grund, JValue.CreateString zu verwenden, wenn Sie Ihre JProperties erstellen, und @Steven Brickner weist darauf hin, dass Sie JArray.Parse("[\"password\"]") zu new JArray("password") vereinfachen können.

Es könnte ausführlicher sein, aber aus Gründen der Lesbarkeit, hier ist es voll gegliedertes:

var auth = 
    new JObject(
     new JProperty("auth", 
      new JObject(
       new JProperty("identity", 
        new JObject(
         new JProperty("methods", new JArray("password")), 
         new JProperty("password", 
          new JObject(
           new JProperty("user", 
            new JObject(
             new JProperty("id", identityWithProject.Username), 
             new JProperty("password", identityWithProject.ProjectName) 
            ) 
           ) 
          ) 
         ) 
        ) 
       ), 
       new JProperty("scope", 
        new JObject(
         new JProperty("project", 
          new JObject(
           new JProperty("id", identityWithProject.ProjectName) 
          ) 
         ) 
        ) 
       ) 
      ) 
     ) 
    ); 
+0

Danke! Ich habe es vorher mit 'new JAArray' versucht, aber es hat nicht funktioniert, also habe ich alle möglichen anderen Möglichkeiten ausprobiert, ohne die falsch platzierten '(' – moondaisy

Verwandte Themen