2013-03-29 3 views
0

Когда я делаю mvc ajax json post applicaiton, возникает проблема преобразования динамического объекта json в объект.Как преобразовать динамический объект json в объект C#

В моем приложении фильм является бизнес-объектом, json-объект имеет свойство статуса строки, чем объект фильма. Когда данные json отправляются на сервер mvc, он может быть преобразован в динамический объект, на этом этапе все нормально. Но после обработки некоторой логики каждому статусу строки необходимо преобразовать динамический объект в бизнес-объект фильма, а затем начать логику транзакций базы данных. Но есть troulbe, даже я пытаюсь использовать другой метод для создания объекта.

пожалуйста, кто-то использовал тот же метод литья? спасибо за ваш совет или ответ.

public class movie 
{ 
    public int id 
    { 
     get; 
     set; 
    } 

    public string title 
    { 
     get; 
     set; 
    } 
} 



    /// <summary> 
    /// Convert Json Object to Entity 
    /// </summary> 
    /// <param name="id">ajax post value 
    /// format: {"id": "{\"id\": 1, \"title\": \"sharlock\", \"RowStatus\": \"deleted\"}"} 
    /// </param> 
    [AllowAnonymous] 
    [HttpPost] 
    public void DoJsonSimple(string id) 
    { 
     string title; 
     var entity = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(id); 

     //*** entity is dynamic object 
     //*** entity.id, entity.title and entity.RowStauts can be accessed. 
     int first = entity.id; 
     var status = entity.RowStatus; 
     if (status == "deleted") 
     { 
      //*** m1 is null 
      //*** m1.title can not be accessed 
      movie m1 = entity as movie; 
      title = m1.title; 

      //*** m2 is an empty object 
      //*** m2.id is 0, m2.title is null 
      var m2 = AutoMapperHelper<dynamic, movie>.AutoConvertDynamic(entity); 
      title = m2.title; 

      //*** Exception: Object must implement IConvertible. 
      var m3 = EmitMapper.EMConvert.ChangeTypeGeneric<dynamic, movie>(entity); 
      title = m3.title; 
     } 
    } 

ответ

1

Просто создайте еще один класс для строк.

public class Request 
{ 
    [JsonProperty("id")] 
    public string Json { get; set; } 
} 

public class Movie 
{ 
    [JsonProperty("id")] 
    public int Id { get; set; } 

    [JsonProperty("title")] 
    public string Title { get; set; } 
} 

// either this for variant 1... 
public class Row 
{ 
    public string RowStatus { get; set; } 
} 

// or that for variant 2... 
public class MovieRow : Movie 
{ 
    public string RowStatus { get; set; } 
} 

[AllowAnonymous] 
[HttpPost] 
public void DoJsonSimple_Variant1(string id) 
{ 
    var json = JsonConvert.DeserializeObject<Request>(id).Json; 
    var entity = JsonConvert.DeserializeObject<MovieRow>(json); 
    var row = JsonConvert.DeserializeObject<Row>(json); 

    switch (row.RowStatus) 
    { 
     case "deleted": 
      // delete entity 
      break; 

     // ... 
    } 

    // ... 
} 

[AllowAnonymous] 
[HttpPost] 
public void DoJsonSimple_Variant2(string id) 
{ 
    var json = JsonConvert.DeserializeObject<Request>(id).Json; 
    var row = JsonConvert.DeserializeObject<MovieRow>(json); 
    var entity = (Movie)row; 

    switch (row.RowStatus) 
    { 
     case "deleted": 
      // delete entity 
      break; 

     // ... 
    } 

    // ... 
} 
+0

привет, Есть много объектов в моем проекте, если необходимо создать новый класс строк каждый объект, это тяжелые работы ... –

+0

Вот почему я предложил вариант 1. Вам просто нужно десериализации ваш JSON два разного типа. Это намного меньше, чем борьба с динамикой. –

+0

Да, лучше новый только один класс Row и десериализовать данные json дважды для любых объектов. отличные идеи, спасибо. –

Смежные вопросы