Серийный объект 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;}
}
и я хочу сериализовать их с корневым именем (имя класса). Это желаемый формат, используя
{'MyCar':
{
'name': 'Ford',
'owner': 'John Smith'
}
}
Я знаю, что могу сделать это с анонимным объектом, но есть ли какое-либо свойство или другой способ в библиотеке Newtonsoft.Json?
Ответы
Ответ 1
Я нашел простой способ сделать это... просто объявить динамический объект и назначить первый элемент в динамическом объекте как ваш класс коллекции... В этом примере предполагается, что вы используете 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"}, {...}]}
Ответ 2
После
с использованием анонимного класса:
var root = new
{
car = new
{
name = "Ford",
owner = "Henry"
}
};
string json = JsonConvert.SerializeObject(root);
Во всем мире
Для проекта веб-API в Global.asax
при запуске приложения:
GlobalConfiguration.Configuration.Formatters.Insert(0, new RootFormatter());
Ответ 3
Вы можете легко создать свой собственный сериализатор
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();
}
Ответ 4
string Json = JsonConvert.SerializeObject(new Car { Name = "Ford", Owner = "John Smith" }, Formatting.None);
для корневого элемента используется GlobalConfiguration.
Ответ 5
Очень простой подход для меня - это просто создать 2 класса.
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"
}
]
}
Надеюсь, это поможет!
Ответ 6
Ну, вы можете, по крайней мере, сообщить 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 объекта.
Это не совсем то, что вы ищете, но для меня это было достаточно хорошо, когда вы столкнулись с аналогичной проблемой.
Ответ 7
Я надеюсь, что эта помощь.
//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();
Ответ 8
[Newtonsoft.Json.JsonObject(Title = "root")]
public class TestMain
Это единственное, что вам нужно добавить, чтобы заставить ваш код работать.