2014-12-16 2 views
1

У меня есть класс модели данных, который я сериализую в JSON, чтобы иметь возможность отправлять серийные JSON в веб-службу. Модель данных выглядит следующим образом:Вставить пользовательские данные в JSON, сериализованные из DataModel

using Newtonsoft.Json; 
namespace WebCrawler.Models { 
    [JsonObject(MemberSerialization.OptIn)] 
    public class LinkDataViewModel 
    { 
     [JsonProperty] 
     public string Title { get; set; } 
     ..... 
     [JsonProperty] 
     public string CustomerID { get; set; } 
    } 
} 

Как следует изменить данные о модели класса для сериализации JSON выглядеть:

{"PostPropertyRequest": {SerializedDataModel}} 

ответ

1
[JsonObject(MemberSerialization.OptIn)] 
public class MyModel 
{ 
    [JsonProperty] 
    public LinkDataViewModel PostPropertyRequest{ get; set; } 
} 

Создание выше модели и сериализации, что.

MyModel model = new MyModel(); 
    model.PostPropertyRequest = your model. 

Теперь сериализуем модель.

+0

Спасибо за советование но Я не могу получить, как использовать его в запросе var a = (from b in _db.LinkData выбрать новый LinkDataViewModel { Заголовок = b.Title, .... CustomerID = b.CustomerID }). Возьмите (10); –

+0

Вы смешиваете две вещи для использования в запросе Linq, это просто должен быть тип IEnumerable . Это не имело бы никакого отношения к сериализации Json. –

1

Вы можете написать свой собственный JSON таким образом (сделать свой класс, производный от JsonConverter и переопределить 3 метода)

using Newtonsoft.Json; 
namespace WebCrawler.Models { 
    [JsonObject(MemberSerialization.OptIn)] 
    public class LinkDataViewModel : JsonConverter 
    { 
     [JsonProperty] 
     public string Title { get; set; } 
     ..... 
     [JsonProperty] 
     public string CustomerID { get; set; } 

     public override object ReadJson(JsonReader reader, Type objectType, object existingValue,   JsonSerializer serializer) 
     { 
      throw new NotImplementedException(); 
     } 

     public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
     { 
      if (value == null) 
      { 
      serializer.Serialize(writer, null); 
      return; 
      }  
      var properties = value.GetType().GetProperties(); 
      writer.WriteStartObject(); 
      //your custom property 
      writer.WritePropertyName("PostPropertyRequest"); 
      writer.WriteStartObject(); 
      foreach (var property in properties) 
      { 
       // write property name 
       writer.WritePropertyName(property.Name); 
       serializer.Serialize(writer, property.GetValue(value, null)); 
      } 
      writer.WriteEndObject(); 
      writer.WriteEndObject(); 
     } 
    } 
} 

см это хороший article документации

+0

. Нет необходимости в настраиваемом сериализаторе для текущего запроса. Сериализатор по умолчанию будет просто выполнять задание –

+0

@MrinalKamboj OP не имеет обертки класса – faby

+0

, насколько сложно создать обертку, я тоже создайте настраиваемый сериализатор, но только тогда, когда я хочу, чтобы значения были изменены/рассчитаны или им нужен префикс/суффикс –

1

Для Json важно понять в отличие от XML он не имеет корневой элемент, то ток Json генерируемый:

{ 
    "Title": "Value", 
    "CustomerID": "Value" 
} 

Что вам нужно:

{ 
"PostPropertyRequest": 
        { 
        "Title": "Value", 
        "CustomerID": "Value" 
        } 
} 

Вам нужно просто обернуть текущий класс, применить JSon свойство и сериализацию:

[JsonObject(MemberSerialization.OptIn)] 
public class LinkDataViewModelWrapper 
{ 
    [JsonProperty("PostPropertyRequest")] 
    public LinkDataViewModel LinkDataViewObj{ get; set; } 
} 

Теперь вам нужно сериализовать LinkDataViewModelWrapper, после инициализации различных элементов и свойств

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