Как сериализовать анонимный объект в 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"
}
Возможно ли иметь A и B на одном уровне OtherOptions без явного удаления.
1 ответ
Решение
Хорошо, это просто ужасно, и я не рекомендую делать это, но оно делает то, что вы хотите...
По сути, он создает словарь только тех свойств, которые вы хотите, а затем сериализует этот словарь.
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 и не возвращать, если он существует.
Опять же, я не рекомендую делать это.