Подтвердить что ты не робот

Серийный объект 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?

4b9b3361

Ответ 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

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