serialize property newtonsoft net name jsonpropertyattribute jsonignore jsonarrayattribute example deserialize attribute c# asp.net .net json json.net

c# - property - Json.NET serializa el objeto con el nombre de raíz



newtonsoft json property name (9)

Usa clase anónima

Dale forma a tu modelo de la forma que quieras usando clases anónimas:

var root = new { car = new { name = "Ford", owner = "Henry" } }; string json = JsonConvert.SerializeObject(root);

En mi aplicación web estoy usando Newtonsoft.Json y tengo el siguiente objeto

[Newtonsoft.Json.JsonObject(Title = "MyCar")] public class Car { [Newtonsoft.Json.JsonProperty(PropertyName = "name")] public string Name{get;set;} [Newtonsoft.Json.JsonProperty(PropertyName = "owner")] public string Owner{get;set;} }

y quiero serializarlos con el nombre de raíz (nombre de clase). Este es el formato deseado usando

{''MyCar'': { ''name'': ''Ford'', ''owner'': ''John Smith'' } }

Sé que puedo hacer eso con un objeto anónimo, pero ¿hay alguna propiedad u otra forma en la biblioteca de Newtonsoft.Json?


Bueno, al menos puede decirle a Json.NET que incluya el nombre del tipo: http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_TypeNameHandling.htm . Newtonsoft.Json.JsonSerializer jser = new Newtonsoft.Json.JsonSerializer(); jser.TypeNameHandling = TypeNameHandling.Objects;

El tipo se incluirá al principio en la propiedad "$ type" del objeto.

Esto no es exactamente lo que estás buscando, pero fue lo suficientemente bueno para mí cuando enfrentaba un problema similar.


Encontré una manera fácil de renderizar esto ... simplemente declare un objeto dinámico y asigne el primer elemento dentro del objeto dinámico para que sea su clase de colección ... Este ejemplo asume que está usando Newtonsoft.Json

private class YourModelClass { public string firstName { get; set; } public string lastName { get; set; } } var collection = new List<YourModelClass>(); var collectionWrapper = new { myRoot = collection }; var output = JsonConvert.SerializeObject(collectionWrapper);

Con lo que deberías terminar es algo como esto:

{"myRoot":[{"firstName":"John", "lastName": "Citizen"}, {...}]}


Espero esta ayuda.

//Sample of Data Contract: [DataContract(Name="customer")] internal class Customer { [DataMember(Name="email")] internal string Email { get; set; } [DataMember(Name="name")] internal string Name { get; set; } } //This is an extension method useful for your case: public static string JsonSerialize<T>(this T o) { MemoryStream jsonStream = new MemoryStream(); var serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(T)); serializer.WriteObject(jsonStream, o); var jsonString = System.Text.Encoding.ASCII.GetString(jsonStream.ToArray()); var props = o.GetType().GetCustomAttributes(false); var rootName = string.Empty; foreach (var prop in props) { if (!(prop is DataContractAttribute)) continue; rootName = ((DataContractAttribute)prop).Name; break; } jsonStream.Close(); jsonStream.Dispose(); if (!string.IsNullOrEmpty(rootName)) jsonString = string.Format("{{ /"{0}/": {1} }}", rootName, jsonString); return jsonString; } //Sample of usage var customer = new customer { Name="John", Email="[email protected]" }; var serializedObject = customer.JsonSerialize();


Lo siento, mi inglés no es tan bueno. Pero me gusta mejorar las respuestas votadas. Creo que usar Dictionary es más simple y limpio.

class Program { static void Main(string[] args) { agencia ag1 = new agencia() { name = "Iquique", data = new object[] { new object[] {"Lucas", 20 }, new object[] {"Fernando", 15 } } }; agencia ag2 = new agencia() { name = "Valparaiso", data = new object[] { new object[] { "Rems", 20 }, new object[] { "Perex", 15 } } }; agencia agn = new agencia() { name = "Santiago", data = new object[] { new object[] { "Jhon", 20 }, new object[] { "Karma", 15 } } }; Dictionary<string, agencia> dic = new Dictionary<string, agencia> { { "Iquique", ag1 }, { "Valparaiso", ag2 }, { "Santiago", agn } }; string da = Newtonsoft.Json.JsonConvert.SerializeObject(dic); Console.WriteLine(da); Console.ReadLine(); } } public class agencia { public string name { get; set; } public object[] data { get; set; } }

Este código genera el siguiente json (este es el formato deseado)

{ "Iquique":{ "name":"Iquique", "data":[ [ "Lucas", 20 ], [ "Fernando", 15 ] ] }, "Valparaiso":{ "name":"Valparaiso", "data":[ [ "Rems", 20 ], [ "Perex", 15 ] ] }, "Santiago":{ "name":"Santiago", "data":[ [ "Jhon", 20 ], [ "Karma", 15 ] ] } }


Puede crear fácilmente su propio serializador

var car = new Car() { Name = "Ford", Owner = "John Smith" }; string json = Serialize(car);

string Serialize<T>(T o) { var attr = o.GetType().GetCustomAttribute(typeof(JsonObjectAttribute)) as JsonObjectAttribute; var jv = JValue.FromObject(o); return new JObject(new JProperty(attr.Title, jv)).ToString(); }


Un enfoque muy simple para mí es solo crear 2 clases.

public class ClassB { public string id{ get; set; } public string name{ get; set; } public int status { get; set; } public DateTime? updated_at { get; set; } } public class ClassAList { public IList<ClassB> root_name{ get; set; } }

Y cuando vas a hacer la serialización:

var classAList = new ClassAList(); //... //assign some value //... var jsonString = JsonConvert.SerializeObject(classAList)

Por último, verá el resultado deseado de la siguiente manera:

{ "root_name": [ { "id": "1001", "name": "1000001", "status": 1010, "updated_at": "2016-09-28 16:10:48" }, { "id": "1002", "name": "1000002", "status": 1050, "updated_at": "2016-09-28 16:55:55" } ] }

¡Espero que esto ayude!


[Newtonsoft.Json.JsonObject(Title = "root")] public class TestMain

este es el único attrib que necesita agregar para que su código funcione.


string Json = JsonConvert.SerializeObject(new Car { Name = "Ford", Owner = "John Smith" }, Formatting.None);

para el elemento raíz use GlobalConfiguration.