Comment puis-je append un nœud racine personnalisé lors de la sérialisation d’un object avec JSON.NET?

J’ai ajouté une propriété personnalisée à certains de mes objects, comme ceci:

[JsonCustomRoot("status")] public class StatusDTO { public int StatusId { get; set; } public ssortingng Name { get; set; } public DateTime Created { get; set; } } 

L’atsortingbut est très simple:

 public class JsonCustomRoot :Atsortingbute { public ssortingng rootName { get; set; } public JsonCustomRoot(ssortingng rootName) { this.rootName = rootName; } } 

La sortie par défaut de JSON.NET lors de la sérialisation d’une instance d’un object est la suivante:

 {"StatusId":70,"Name":"Closed","Created":"2012-12-12T11:50:56.6207193Z"} 

Maintenant, la question est la suivante: comment puis-je append un nœud racine au JSON avec la valeur de l’atsortingbut personnalisé comme suit :

 {status:{"StatusId":70,"Name":"Closed","Created":"2012-12-12T11:50:56.6207193Z"}} 

J’ai trouvé plusieurs articles mentionnant l’interface IContractResolver , mais je ne comprends pas comment le faire. Mes tentatives incluent ce morceau de code inachevé:

 protected override JsonObjectContract CreateObjectContract(Type objectType) { JsonObjectContract contract = base.CreateObjectContract(objectType); var info = objectType.GetCustomAtsortingbutes() .SingleOrDefault(t => (Type)t.TypeId==typeof(JsonCustomRoot)); if (info != null) { var myAtsortingbute = (JsonCustomRoot)info; // How can i add myAtsortingbute.rootName to the root from here? // Maybe some other method should be overrided instead? } return contract; } 

Voici une solution spécifiquement pour les API Web, que j’utilise également: RootFormatter.cs

Je l’ai écrit sur la base de la création d’un API JSONP Formatter pour ASP.NET Web .

Au lieu d’utiliser un atsortingbut personnalisé, je réutilise le champ Title de JsonObjectAtsortingbute . Voici un code d’utilisation:

 using Newtonsoft.Json [JsonObject(Title = "user")] public class User { public ssortingng mail { get; set; } } 

Ajoutez ensuite RootFormatter à votre App_Start et enregistrez-le comme suit dans WebApiConfig :

 GlobalConfiguration.Configuration.Formatters.Insert(0, new RootFormatter()); 

J’ai pu obtenir une réponse WebMessageBodyStyle.Wrapped similaire à WebMessageBodyStyle.Wrapped de WCF:

 {"user":{ "mail": "[email protected]" }} 

Que faire si vous utilisez un object anonyme?

 JSON.Serialize(new { status = targetObject}); 

Une façon très simple d’approche consiste à placer l’object dans un autre object. il était peut-être trop simpliste de regarder, mais cela fonctionne lorsque vous travaillez avec des collections et des objects singuliers.

  public class StatusDTO { public int StatusId { get; set; } public ssortingng Name { get; set; } public DateTime Created { get; set; } } public class statusJasonModel { public StatusDTO status { get; set; } } 

Maintenant, si vous placez StatusDTO dans l’object statusJsonModel et le sérialisez en tant que Json. Cela devrait vous donner la réponse souhaitée.

J’ai eu le même défi dans l’un de mes projets. Vous trouverez ci-dessous la démarche que j’ai entreprise pour résoudre le problème.

1. Mon cours d’entité

 public class Product { [Key] public ssortingng Id { get; set; } public ssortingng Title { get; set; } public ssortingng Album { get; set; } public ssortingng Artist { get; set; } public ssortingng Genre { get; set; } } 

2. Créé une autre classe, définie dans ce formulaire.

  public class KindOfMedia { public KindOfMedia() { Product = new List(); } public List Product { get; set; } } 

3. Le contrôleur API Web, qui renverra json

  public HttpResponseMessage Products() { var kind = new KindOfMedia(); kind.Products = new List(); kind.Products.Add(new Product { Id = Guid.NewGuid().ToSsortingng(), Title = "I am A Winner", Album = "", Artist = "Project Fame", Genre = "Contemporal" }); kind.Products.Add(new Product { Id = Guid.NewGuid().ToSsortingng(), Title = "Great Nation", Album = "Oceans", Artist = "Timi Dakolo", Genre = "Gospel" }); return Request.CreateResponse(HttpStatusCode.OK, kind); } 

4. Ajoutez cette ligne de code à mon fichier WebApi Config dans le dossier App_Start.

  var json = config.Formatters.JsonFormatter; json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.None; 

veuillez noter que Newtonsoft.Json.PreserveReferencesHandling.None ne conservera pas la référence du type sérialiser

Le Json résultant est

 { "Musics": [ { "Id": "bf9faeee-7c39-4c33-a0ea-f60333604061", "Title": "I am A Winner", "Album": "", "Artist": "Project Fame", "Genre": "Contemporal" }, { "Id": "243edd32-7ba2-4ac4-8ab9-bba6399cb0a6", "Title": "Great Nation", "Album": "Oceans", "Artist": "Timi Dakolo", "Genre": "Gospel" } ] }