2017-09-05 1 views
0

Je fonctionne dans .NET Framework à l'aide d'ASP.NET MVC 5. J'ai un contrôleur MVC qui utilise Newtonsoft.Json (ou json.net) pour créer un objet JSON sympa . Le problème que je suis en cours d'exécution en est que lorsque je retourne mon JSON en utilisant la méthode JsonResultJson(JSONdotnetObject), je me retrouve avec un résultat qui a la même structure que ce que je pense, mais tout est vide JArrays comme ceci:Les objets JSON sont sérialisés à des parenthèses vides lorsqu'ils sont renvoyés à l'aide de JsonResult

attendu:

{ 
    "prop": { 
     ... some stuff ... 
    }, 
    "another prop": { 
     ... more stuff ... 
    } 
} 

Actual:

[ 
    [ 
     ... empty ... 
    ], 
    [ 
     ... also empty ... 
    ] 
] 

Et voici le code:

public ActionResult methodName(string input) { 
    JObject myJSON = new JObject(); 

    // Populate myJSON with children 
    foreach (Thing thing in ExistingEntityFrameworkCustomClass) { 
     JObject newChild = new JObject(); 

     // Add some props to newChild using newChild["propName"] = thing.Property 

     myJSON.Add(newChild.UniqueIdTakenFromEntity.ToString(), newChild); 
    } 

    // The JsonResult successfully populates it's Data field with myJSON before returning. 
    return Json(myJSON, JsonRequestBehavoir.AllowGet); 
} 

Ce n'est pas la structure exacte, mais j'espère que cela illustre ce que je vis. J'ai parcouru le programme ligne par ligne dans VS et l'objet JsonResult contient correctement le JObject dans le champ JsonResult.Data, mais quand il retourne quelque chose ne va pas avec la sérialisation qu'ASP.NET effectue qui me fait perdre mon beau JSON objet: * (

je travaille autour de cette question en retournant simplement un JObject au lieu d'un ActionResult de la méthode, mais ce n'est pas idéal parce que je dois ensuite régler manuellement les en-têtes de réponse à l'aide Result.ContentType qui se sent comme un hack.

Permettez-moi de savoir si vous avez des idées ou pouvez utiliser plus de détails. Nous vous remercions de votre temps.

+1

Vous devez ajouter du code afin que nous puissions voir ce que vous faites – JSON

+0

Will do. J'ajouterai une implémentation de base de ce que je fais par code. –

+0

Si c'est vide, nous devons voir comment vous peuplez l'objet. – Amy

Répondre

3

Le problème est que la méthode Json dans la classe Contrôleur MVC utilise JavaScriptSerializer en interne (pas Json.Net), et ne sait pas comment sérialiser un JObject correctement. Essayez d'utiliser la méthode Content à la place:

public ActionResult methodName(string input) { 
    JObject myJSON = new JObject(); 

    // Populate myJSON with children 

    return Content(myJSON.ToString(), "application/json", Encoding.UTF8); 
} 

Vous pouvez également implémenter votre propre classe JsonNetResult comme indiqué dans l'article de blog de James Newton-King, ASP.NET MVC and Json.NET.

+0

Cela fonctionne parfaitement pour moi. Merci pour l'explication rapide et facile et l'extrait de code. –

+1

Je suis heureux d'avoir pu aider. –