Серийный объект Json.NET с корневым именем

В моем веб-приложении я использую Newtonsoft.Json, и у меня есть следующий объект

[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;} } 

и я хочу сериализовать их с именем root (имя classа). Это желаемый формат, используя

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

Я знаю, что могу сделать это с анонимным объектом, но есть ли какое-либо свойство или другой способ в библиотеке Newtonsoft.Json?

Я нашел простой способ сделать это … просто объявить динамический объект и назначить первый элемент в динамическом объекте как ваш class коллекции … В этом примере предполагается, что вы используете Newtonsoft.Json

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

То, что вы должны сделать, это примерно так:

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

Использовать анонимный class

Формируйте свою модель так, как вы хотите, используя анонимные classы:

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

Вы можете легко создать свой собственный сериализатор

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

 string Serialize(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(); } 
 string Json = JsonConvert.SerializeObject(new Car { Name = "Ford", Owner = "John Smith" }, Formatting.None); 

для корневого элемента используется GlobalConfiguration.

Для меня очень простой подход – просто создать 2 classа.

 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 root_name{ get; set; } } 

И когда вы собираетесь делать сериализацию:

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

Наконец, вы увидите желаемый результат следующим образом:

 { "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" } ] } 

Надеюсь это поможет!

Ну, вы можете, по крайней мере, сообщить Json.NET о включении имени типа: http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_TypeNameHandling.htm . Newtonsoft.Json.JsonSerializer jser = new Newtonsoft.Json.JsonSerializer(); jser.TypeNameHandling = TypeNameHandling.Objects;

Тип будет включен в начале в свойство $ type объекта.

Это не совсем то, что вы ищете, но для меня это было достаточно хорошо, когда вы столкнулись с аналогичной проблемой.

Извините, мой английский не так уж хорош. Но мне нравится улучшать ответы. Я думаю, что использование Словаря проще и чище.

 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 dic = new Dictionary { { "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; } } 

Этот код генерирует следующий json (это желаемый формат)

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

Надеюсь, эта помощь.

 //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(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(); 
 [Newtonsoft.Json.JsonObject(Title = "root")] public class TestMain 

это единственное, что вам нужно добавить, чтобы заставить ваш код работать.

  • Можно ли указать путь в атрибуте для сопоставления свойства в моем classе с дочерним свойством в моем JSON?
  • Исключение «Исключительная привязка к реляционной ссылке» с JSON.Net
  • Как получить json.net для сериализации членов classа, полученных из List ?
  • Указание пользовательского формата DateTime при сериализации с помощью Json.Net
  • Как я могу разобрать строку JSON, которая приведет к незаконным идентификаторам C #?
  • Отключить использование JSON.net
  • Конвенция о присвоении имен JSON
  • Что такое эквивалент JSON.NET XPath, SelectNodes XML, SelectSingleNode?
  • Json.NET Отключить десериализацию в DateTime
  • Как написать Json-файл в C #?
  • Удаление десериализации JSON в объект с помощью Json.NET
  • Давайте будем гением компьютера.