2014-12-29 3 views
0

Это сообщение JSON, которое я получаю с сервера (который я не могу изменить). Может быть возвращено много объектов (время/значение), но в этом случае есть только один. Формат остается неизменным.Дезабилизация коллекции JSON в C#

{ 
    "data": [ 
    { 
     "time": "2014-12-12T13:52:43", 
     "value": 255.0 
    } 
    ] 
} 

Я пытаюсь десериализовать JSON на очень простой объект C#.

public class Dataentry { 
    public float Value { get; set; } 
    public DateTime Time { get; set; } 
} 

Я попытался десериализации с библиотеками Newtonsoft в Json.NET и RestSharp без успеха. Следующий код не работает, но я ничего не пробовал :-) У меня нет ошибки - просто пустой объект с начальными значениями по умолчанию.

var myObject = JsonConvert.DeserializeObject<Dataentry> (jsonString); 

Поскольку эти библиотеки не очень интуитивно понятны или хорошо документированы в этом случае, я потерян. Разве такой JSON невозможно десериализовать? Я действительно хотел бы использовать готовую библиотеку, поэтому любая помощь будет оценена по достоинству.

+0

Наоборот, я считаю, что 'json.net' имеет очень хорошую документацию. Вы просто не понимаете синтаксис JSON; -], поэтому вы не знали, чего ожидать от него; -] – t3chb0t

+1

Вы правы, что я не понимаю эту проблему полностью - вот почему у меня проблемы: -) Особенно в json.net есть много документации, и это здорово. Но он основан на том, что делает библиотека - не столько, как ее использовать. Я думаю, что это общая проблема в любой библиотеке. Документация обычно записывается как справочное руководство, когда вы знаете, что делаете. Новичкам необходимо больше использовать наборы-основанные/начатые типы вещей. – Borre

+0

Если вы не возражаете, и любой из ответов решил вашу проблему, было бы неплохо, если бы вы выбрали тот, который помог вам, чтобы все знали, что он решен. – t3chb0t

ответ

5

Это не работает, потому что ваш JSON задает коллекцию, и вы пытаетесь выполнить деселанизацию в один объект. Есть много JSON к с генераторами # класса вы можете вставить JSON в, чтобы получить определение соответствующего класса (ов) один такой генератор расположен here

Более подходящее определение было бы

public class Datum 
{ 
    public string time { get; set; } 
    public double value { get; set; } 
} 

public class RootObject 
{ 
    public List<Datum> data { get; set; } 
} 

Тогда deseralize в

var myObject = JsonConvert.DeserializeObject<RootObject> (jsonString); 
+0

Отличный !!! сайт потрясающий для создания классов – VhsPiceros

+0

Я пробовал это, и он сработал. Задача решена! Это простой способ создать классы и хорошо знать в будущем. Инструменты избили невежество :-) – Borre

0

изменить ваш DateEntry связывание Определение

public class ArrayData{ 
    public DataEntry data {set; get;} 
} 

public class DataEntry { 
    public float Value { get; set; } 
    public DateTime Time { get; set; } 
} 

в методе теперь вы можете получили объект ArraData

быть осторожным со значениями даты и времени строки посланных для правильного связывания

1

Я хотел бы добавить некоторые дополнительные explanetion на ваш вопрос ...

Пишешь Я пытаюсь десериализовать JSON на очень простой объект C#. - к сожалению, это не полная истина. Вы пытаетесь десериализовать коллекцию очень простых объектов C#. Индикатор для этого являются квадратными скобками в вашем JSON:

{ 
    "data": [ 
    { 
     "time": "2014-12-12T13:52:43", 
     "value": 255.0 
    } 
    ] 
} 

Это означает, что существует класс со свойством именемdata (может ба сопоставляются с другим имени, но ради палочки простоты в к этому имени) и что это свойство является типом коллекции. Он может быть одним из любых типов, поддерживающих интерфейс IEnumerable.

public class DataCollection 
{ 
    public DataItem[] data { get; set; } 
    //public List<DataItem> data { get; set; } // This would also work. 
    //public HashSet<DataItem> data { get; set; } // This would work too. 
} 

public class DataItem 
{ 
    public float value { get; set; } 
    public DateTime time { get; set; } // This would work because the time is in an ISO format I believe so json.net can parse it into DateTime. 
} 

Следующий шаг - рассказать Json.Net, как десериализировать его.Теперь, когда вы знаете, что это сложный типа данных вы можете использовать тип, который описывает структуру JSon для десериализации:

var dataCollection = JsonConvert.DeserializeObject<DataCollection>(jsonString); 

Если вы не имеете data свойства в вас JSon строке, но что-то вроде этого:

[ 
    { 
     "time": "2014-12-12T13:52:43", 
     "value": 255.0 
    }, 
    { 
     "time": "2016-12-12T13:52:43", 
     "value": 25.0 
    }, 
] 

можно непосредственно десериализации его в качестве коллекции:

var dataItems = JsonConvert.DeserializeObject<List<DataItem>>(jsonString); 

или

var dataItems = JsonConvert.DeserializeObject<DataItem[]>(jsonString); 
+0

Это было очень полезно. Структура JSON меня потеряла (это кажется странно сложным), но это помогло мне понять, почему это было неправильно. Благодаря! – Borre

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