Json.NET序列化具有根名称的对象

在我的networking应用程序中,我使用的是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;} } 

我想序列化它们的根名称(类名称)。 这是使用所需的格式

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

我知道我可以用匿名对象来做到这一点,但是在Newtonsoft.Json库中有任何属性或其他方式吗?

我find了一个简单的方法来渲染出来…只需声明一个dynamic对象,并将dynamic对象中的第一个项目指定为您的集合类…此示例假定您使用的是Newtonsoft.Json

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

你应该得到的是这样的:

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

一旦

使用匿名类:

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

在全球范围内

对于Web API项目,在Global.asax上应用程序启动:

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

您可以轻松创build自己的序列化程序

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

为根元素使用GlobalConfiguration。

对我来说一个非常简单的方法就是创build两个类。

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

而当你要做序列化时:

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

希望这可以帮助!

那么,你至less可以告诉Json.NET包含types名称: http : //www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_TypeNameHandling.htm 。 Newtonsoft.Json.JsonSerializer jser = new Newtonsoft.Json.JsonSerializer(); jser.TypeNameHandling = TypeNameHandling.Objects;

该types将被包含在对象的“$ type”属性的开头。

这不是你正在寻找的东西,但是当面对一个类似的问题时,这对我来说已经足够了。

我希望这个帮助。

 //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="john@domain.com" }; var serializedObject = customer.JsonSerialize(); 
 [Newtonsoft.Json.JsonObject(Title = "root")] public class TestMain 

这是您需要添加才能使您的代码工作的唯一基础。