2015-08-30 2 views
4

Я новичок здесь, поэтому, пожалуйста, извините любые упущения в правильной процедуре вопроса!Deserializing многомерная строка JSON

В принципе, я пытаюсь десериализовать массив json из API Pearson Dictionary Web API. Вот JSON (я удалил некоторые избыточные results индексы для экономии места):

{ 
    "status": 200, 
    "offset": 0, 
    "limit": 10, 
    "count": 10, 
    "total": 47, 
    "url": "/v2/dictionaries/ldoce5/entries?headword=test", 
    "results": [ 
    { 
     "datasets": [ 
     "ldoce5", 
     "dictionary" 
     ], 
     "headword": "test", 
     "homnum": 1, 
     "id": "cqAFzDfHTM", 
     "part_of_speech": "noun", 
     "pronunciations": [ 
     { 
      "audio": [ 
      { 
       "lang": "British English", 
       "type": "pronunciation", 
       "url": "/v2/dictionaries/assets/ldoce/gb_pron/brelasdetest.mp3" 
      }, 
      { 
       "lang": "American English", 
       "type": "pronunciation", 
       "url": "/v2/dictionaries/assets/ldoce/us_pron/test1.mp3" 
      } 
      ], 
      "ipa": "test" 
     } 
     ], 
     "senses": [ 
     { 
      "definition": [ 
      "a set of questions, exercises, or practical activities to measure someone's skill, ability, or knowledge" 
      ], 
      "examples": [ 
      { 
       "audio": [ 
       { 
        "type": "example", 
        "url": "/v2/dictionaries/assets/ldoce/exa_pron/p008-001626298.mp3" 
       } 
       ], 
       "text": "Did you get a good mark in the test ?" 
      } 
      ], 
      "gramatical_examples": [ 
      { 
       "examples": [ 
       { 
        "audio": [ 
        { 
         "type": "example", 
         "url": "/v2/dictionaries/assets/ldoce/exa_pron/p008-000592041.mp3" 
        } 
        ], 
        "text": "We have a test on irregular verbs tomorrow." 
       } 
       ], 
       "pattern": "test on" 
      } 
      ], 
      "signpost": "exam" 
     } 
     ], 
     "url": "/v2/dictionaries/entries/cqAFzDfHTM" 
    } 
    ] 
} 

А вот это C# код, я использую десериализации выше:

class Program 
    { 
     static void Main(string[] args) 
     { 
      string word = "test"; 

      string sURL = "https://api.pearson.com:443/v2/dictionaries/ldoce5/entries?headword=" + word; 

      WebClient client = new WebClient(); 
      string full = client.DownloadString(sURL); 

      var final = JsonConvert.DeserializeObject<Dictionary>(full); 

      Console.WriteLine(final.results[0].senses.definition); 
     } 
    } 

    public class Dictionary 
    { 
     public Result[] results { get; set; } 
    } 

    public class Result 
    { 
     public string part_of_speech { get; set; } 
     public Senses senses { get; set; } 
    } 

    public class Senses 
    { 
     public string definition { get; set; } 
    } 

По какой-то причине, я м получает эту странную ошибку, когда я пытаюсь запустить его:

не может десериализации текущего массива JSON (например, [1,2,3]) в типа «TestingJson.Senses», так как тип требует объекта JSON (например {"name": "value"}) для десериализации. Чтобы исправить эту ошибку, сменил JSON на объект JSON (например, {"name": "value"}) или изменил десериализованный тип на массив или тип, реализующий интерфейс (например, ICollection, IList), например Список, который может быть , десериализован из массива JSON. JsonArrayAttribute также может быть добавлен в тип , чтобы заставить его десериализоваться из массива JSON. Путь 'Результаты [0] .senses', line 1, position 512.

Помощь была бы принята с благодарностью!

+0

Не заставляйте его использовать словарь, пусть он создает свой собственный объект. – Blindy

+0

«Словарь» - это класс, который я создал, а не .NET. Словарь – Destroyer97

+0

«Чувства» - это особый тип. узел JSON 'senses' является множественным (массив) .. вы не можете вставлять объект в форме множественной формы в отверстие в форме единственной формы. –

ответ

6

Если вы взаимодействуете с чем-то определенным (т. Е. Подавляющим большинством API-интерфейсов), вам гораздо лучше создавать сильно типизированные объекты вместо динамических или словарных.

В Visual Studio, если вы идете Edit>Paste Special>Paste JSON as Classes, тогда он сгенерирует все необходимые вам объекты.

public class Rootobject 
{ 
    public int status { get; set; } 
    public int offset { get; set; } 
    public int limit { get; set; } 
    public int count { get; set; } 
    public int total { get; set; } 
    public string url { get; set; } 
    public Result[] results { get; set; } 
} 

public class Result 
{ 
    public string[] datasets { get; set; } 
    public string headword { get; set; } 
    public int homnum { get; set; } 
    public string id { get; set; } 
    public string part_of_speech { get; set; } 
    public Pronunciation[] pronunciations { get; set; } 
    public Sens[] senses { get; set; } 
    public string url { get; set; } 
} 

public class Pronunciation 
{ 
    public Audio[] audio { get; set; } 
    public string ipa { get; set; } 
} 

public class Audio 
{ 
    public string lang { get; set; } 
    public string type { get; set; } 
    public string url { get; set; } 
} 

public class Sens 
{ 
    public string[] definition { get; set; } 
    public Example[] examples { get; set; } 
    public Gramatical_Examples[] gramatical_examples { get; set; } 
    public string signpost { get; set; } 
} 

public class Example 
{ 
    public Audio1[] audio { get; set; } 
    public string text { get; set; } 
} 

public class Audio1 
{ 
    public string type { get; set; } 
    public string url { get; set; } 
} 

public class Gramatical_Examples 
{ 
    public Example1[] examples { get; set; } 
    public string pattern { get; set; } 
} 

public class Example1 
{ 
    public Audio2[] audio { get; set; } 
    public string text { get; set; } 
} 

public class Audio2 
{ 
    public string type { get; set; } 
    public string url { get; set; } 
} 
+0

Хороший совет на пасту. Можете ли вы обновить, чтобы указать версию (версии), которая поддерживается внутри, так что через несколько лет это будет иметь контекстуальное значение для хорошего ответа! –

+0

Большое спасибо! Да, я на визуальной студии 2010 года, и нет «Edit> Paste Special», поэтому спасибо, что вложили его выше. lol: P – Destroyer97

+0

Не уверен, когда он появился, я использовал VS2013, но проверил VS2012, и этот вариант тоже существовал. – viggity