Pregunta

I'm doing some work for a JIRA REST lib. It uses JSON for communication. Part of the objects I receive in JSON format are know. The others can be of several different formats. So what I have done is created an object with properties that hide a dictionary

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);
         }
    }

So I have a bunch of classes like that. I can deserialize into them no problem since JavaScriptSerializer (or any other JSON deserializer) just takes the values and puts them into properties of the objects objects automatically. However there are a bunch of unknown fields all starting with "customField_XXXXX".

What I am currently doing is overriding the JavaScriptSerializer and manually putting EVERYTHING into place. Another idea I got from someone else's code was to re-serialize the dictionary inside the JavaScriptConverter override, then deserialize it into the issue, then put everything else in manually from the dictionary, but that adds a lot of overhead and certainly will raise more than a few eyebrows.

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

Is there any way to get the object back with whatever it could serialize AND the dictionary so I can fill in anything it couldn't on my own? I just haven't been able to find anything other than this method....

Thanks!

¿Fue útil?

Solución

Json.Net has a built-in "Extension Data" feature that might solve your problem. After deserializing known properties into your class, it automatically handles adding any "extra" object properties to a dictionary. You can read about it on the author's blog. Also check out this answer for some example code.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top