2013-07-29 3 views
1

Я пытаюсь десериализации некоторые JSON в классе .net:Deserialize JSON с преобразователем

{"reset": true, "cursor": "xxxx", "has_more": true, "entries": [ 
    ["/ict", { 
     "revision": 22, 
     "rev": "16010e2631", 
     "thumb_exists": false, 
     "bytes": 0, 
     "modified": "Sat, 11 Sep 2010 00:11:24 +0000", 
     "path": "/ICT", 
     "is_dir": true, 
     "size": "0 bytes" 
    }], 
    ["/ict/docs", { 
     "revision": 1772, 
     "rev": "6ec010e2631", 
     "thumb_exists": false, 
     "bytes": 0, 
     "modified": "Wed, 15 Sep 2010 09:55:24 +0000", 
     "path": "/ICT/Docs", 
     "is_dir": true, 
     "size": "0 bytes" 
    }] 
]} 

У меня возникли проблемы с элементами части, каждый массив начинается со строки, но он не имеет ключа. Класс следует десериализация, чтобы выглядеть следующим образом:

[JsonConverter(typeof(DeltaEntryConverter))] 
public class DeltaEntry 
{     
    public string Path { get; set; }   
    public MetaData MetaData { get; set; } 
} 

Я думал использовать jsonConverter, но я не уверен, как десериализацию объекта (второй индекс в каждом массиве) к классу метаданных, если я используйте конвертер.

ответ

2

С учетом объекта, который вы хотите преобразовать, вы можете использовать ToObject<T>() для получения преобразованного объекта. В вашем случае вы хотите преобразовать второй элемент в массив в объект MetaData.

public class DeltaEntryConverter : JsonConverter 
{ 
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     var arr = (JArray)serializer.Deserialize(reader); 
     return new DeltaEntry 
     { 
      Path = (string)arr[0], 
      MetaData = arr[1].ToObject<MetaData>(), 
     }; 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 

    public override bool CanConvert(Type objectType) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

Awesome, отлично работает. благодаря! – Jesse

+0

Я только заметил, что есть лучший способ конвертировать в объект MetaData. Используйте метод «ToObject ()». –

+0

Это более читаемо, но внутри оно работает так же верно? – Jesse

Смежные вопросы