2014-02-19 5 views
0

Получаю код JSON ниже с веб-сайта; К сожалению, я не могу контролировать или изменять это. Рабочая часть является переменной, поэтому можно добавлять или удалять рабочих. (минимум 1 работник)Попытка десериализации переменной вложенной JSON

Обычно вы ожидаете, что часть WORKERS будет массивом JSON, но, к сожалению, это не так.

{ 
"confirmed_rewards": "0.00000", 
"hashrate": 0, 
"payout_history": "0.000000000", 
"estimated_rewards": 0.0000000, 
"workers": { 
    "worker.1": { 
     "alive": true, 
     "hashrate": 1 
    }, 
    "worker.2": { 
     "alive": false, 
     "hashrate": 0 
    } 
}, 
"efficiency": "100.00", 
"shares": "0", 
"rewardType": "4"} 

Я пытался десериализацией строки JSON, используя следующие классы:

public class Status 
{ 
    public string confirmed_rewards; 
    public int hashrate; 
    public string payout_history; 
    public string estimated_rewards; 
    public List<Worker> workers; 
    public string efficiency; 
    public string shares; 
    public string rewardType; 
} 

public class Worker 
{ 
    public WorkerStatus Status; 
} 

public class WorkerStatus 
{ 
    public bool alive; 
    public int hashrate; 
} 

К сожалению, это просто дает мне ошибку:

Cannot deserialize the current JSON object (e.g. {"name":"value"}) into 
type 'System.Collections.Generic.List`1[Worker]' because the type requires a 
JSON array (e.g. [1,2,3]) to deserialize correctly. 

мне действительно любопытно, если есть хороший способ десериализации этого. Запомнить; число (и имена!) рабочих МОЖЕТ меняться! Так что просто создание hardcoded класса с именем worker.1 не является вариантом.

+0

Вы пробовали изменения определения массив? т. е. вместо «Список работников;» объявлять как «Рабочие [] работники;' – LB2

+0

Deserialize to map? – fge

+0

@ LB2, который не решит проблему. Проблема i в том, что 'работники' являются объектом, а не массивом. Я рекомендую читать свойства «работников» в словаре, где ключ - это имя экземпляра, а значение - это объект «Рабочий». Это может потребовать создания настраиваемого сериализатора, но не положительного, но я гарантирую, что имеется достаточная информация для решения проблемы в документах json.NET. – evanmcdonnal

ответ

2

Поскольку worker.n не является допустимым именем свойства и может изменяться с числом работников, объявить работников в Dictionary<string, Worker>

var workers = JsonConvert.DeserializeObject<Status>(json); 

public class Worker 
{ 
    public bool alive { get; set; } 
    public int hashrate { get; set; } 
} 

public class Status 
{ 
    public string confirmed_rewards { get; set; } 
    public int hashrate { get; set; } 
    public string payout_history { get; set; } 
    public double estimated_rewards { get; set; } 
    public Dictionary<string, Worker> workers { get; set; } 
    public string efficiency { get; set; } 
    public string shares { get; set; } 
    public string rewardType { get; set; } 
} 
+1

Пробовал это решение, и он работает! спасибо L.B. – Rknabben

+0

@Rknabben Если вы еще этого не читали: http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work –

0

вы пытались что-то вроде:

Status datalist = JsonConvert.DeserializeObject<Status>(jsonstring); 

Вам понадобится ка ваш рабочий словарь для этого, а

public Dictionary<string, Worker> workers { get; set; } 

Этого использование Newtonsoft.Json

+1

Словарь действительно был способ пойти :) – Rknabben

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