任何库都可以自动和手动反序列化JSON?

时间:2014-03-14 17:22:38

标签: c# .net json rest jira

我为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

有没有什么方法可以将对象与序列化和字典集合起来,这样我就可以填写它自己无法解决的任何内容了?我还没有找到除此方法之外的任何东西......

谢谢!

1 个答案:

答案 0 :(得分:0)

Json.Net有一个内置的&#34;扩展数据&#34;功能可能会解决您的问题。在将已知属性反序列化到您的类后,它会自动处理添加任何&#34;额外&#34;对象属性到字典。您可以在the author's blog上阅读相关信息。另请查看this answer以获取一些示例代码。