我为JIRA REST lib做了一些工作。它使用JSON进行通信。 我以JSON格式收到的部分对象是已知的。其他可以有几种不同的格式。所以我所做的是创建一个具有隐藏字典的属性的对象
public IssueFields Fields { get; set; }
public IssueType IssueType
{
get { return Fields.IssueType; }
set { Fields.IssueType= value; }
}
IssueFields
{
private Dictionary<string, Field> _fields = new Dictionary<string, Field>();
public string IssueType
{
get { return GetFieldByName<IssueType>(IssueTypeFieldName); }
set { SetFieldByName(IssueTypeFieldName, value); }
}
public T GetFieldByName<T>(string fieldName) where T : class
{
return _fields.ContainsKey(fieldName) ? _fields[fieldName] as T: null;
}
public void SetFieldByName(string fieldName, Field field)
{
if (_fields.ContainsKey(fieldName))
{
_fields[fieldName] = field;
}
else
{
_fields.Add(fieldName, field);
}
}
所以我有很多这样的课程。我可以反序列化它们没有问题,因为JavaScriptSerializer(或任何其他JSON反序列化器)只接受值并自动将它们放入对象对象的属性中。然而,有一堆未知的字段都以&#34; customField_XXXXX&#34;开头。
我目前正在做的是重写JavaScriptSerializer并手动将所有内容放到位。我从其他人的代码中获得的另一个想法是重新序列化JavaScriptConverter覆盖中的字典,然后将其反序列化为问题,然后将其他所有内容从字典中手动放入,但这会增加很多开销,当然会引起不止一些人的注意。
public class MyConverter : JavaScriptConverter
{
private static JavaScriptSerializer _javaScriptSerializer;
public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
{
string json = _javaScriptSerializer.Serialize(dictionary);
Issue issue = _javaScriptSerializer.Deserialize<Issue>(json);
// Then add the rest of my objects manually
有没有什么方法可以将对象与序列化和字典集合起来,这样我就可以填写它自己无法解决的任何内容了?我还没有找到除此方法之外的任何东西......
谢谢!
答案 0 :(得分:0)
Json.Net有一个内置的&#34;扩展数据&#34;功能可能会解决您的问题。在将已知属性反序列化到您的类后,它会自动处理添加任何&#34;额外&#34;对象属性到字典。您可以在the author's blog上阅读相关信息。另请查看this answer以获取一些示例代码。