2013-12-19 5 views
1

Я следующий код:Как сериализовать анонимный объект в JSON, не включая имя свойства

///<summary> 
///In this case you can set any other valid attribute for the editable element. 
///For example, if the element is edittype:'text', we can set size, maxlength, 
///etc. attributes. Refer to the valid attributes for the element 
///</summary> 
public object OtherOptions { get; set; } 
public override string ToString() 
{ 
    return this.ToJSON(); 
} 

Мне нужен, чтобы получить анонимный объект от объекта OtherOptions и сериализаций каждого свойства анонимного объекта, как это было с основной объект.

Например:

OtherOptions = new { A = "1", B = "2" } 

Если я сериализации, он будет (или что-то вроде этого):

OtherOptions: { 
A: "1", 
B: "2" 
} 

Можно ли иметь А и В на том же уровне OtherOptions без явно удалив его.

+1

Короткий ответ: нет. Вам нужно будет запланировать график объекта или использовать сериализацию пользовательских объектов. – user2864740

ответ

2

Хорошо это просто некрасиво, и я не рекомендую это делать, но это то, что вы хотите ...

По сути, это создает словарь только свойства, которые вы хотите, а затем упорядочивает, что словарь.

static void Main(string[] args) 
    { 
     JavaScriptSerializer serializer = new JavaScriptSerializer(); 

     var obj = new {Prop1 = "val1", OtherOptions = new {A = "1", B = "2"}}; 

     IDictionary<string, object> result = new Dictionary<string, object>(); 
     foreach (var kv in GetProps(obj)) 
     { 
      if (!kv.Key.Equals("OtherOptions")) 
       result.Add(kv); 
     } 
     foreach (var kv in GetProps(obj.OtherOptions)) 
     { 
      result.Add(kv); 
     } 
     var serialized = serializer.Serialize(result); 
    } 

    static IEnumerable<KeyValuePair<string, object>> GetProps(object obj) 
    { 
     var props = TypeDescriptor.GetProperties(obj); 
     return 
      props.Cast<PropertyDescriptor>() 
       .Select(prop => new KeyValuePair<string, object>(prop.Name, prop.GetValue(obj))); 
    } 

сериализованная становится

{"Prop1":"val1","A":"1","B":"2"} 

Вы можете использовать атрибут на поле, которое вы хотите игнорировать, а затем проверить этот атрибут в методе GetProps и не возвращается, если существует.

Опять же, я не рекомендую это делать.