Как разобрать/десериализовать JSON, возвращенный из службы отдыха в С#

Я получаю JSON в строковом формате из URL-адреса, структура которого подобна этой, но я не могу его проанализировать. Это исключение, есть идеи, как его разобрать?

Вот структура:

{
   "pathway":{
      "patients":{
         "patient":[
            {
               "patientid":"7703176",
               "name":"Abbot, Bud",
               "status":"Invited",
               "start":"2013-12-07",
               "last":"N/A",
               "engagement":"N/A",
               "drug":"N/A",
               "adherence":"N/A",
               "vitals":"Current",
               "last_appointment":"2013-10-25",
               "next_appointment":"None"
            },
            {
               "patientid":"5089554",
               "name":"Brennan, Bonnie",
               "status":"Connected",
               "start":"2013-12-29",
               "last":"2014-02-01",
               "engagement":"Low",
               "drug":" ",
               "adherence":" ",
               "vitals":"Out of Date",
               "last_appointment":"2013-04-21",
               "next_appointment":"None"
            }
         ]
      }
   }
}

я делаю так:

public class PathWayWrapper
{
    public pathway pathway { get; set; }
}

а также

public class pathway
{
    public List<patient> patients { get; set; }
}

а также

public class patient
{
    public long patientid { get; set; }
    public string name { get; set; }
    public string status { get; set; }
    public string start { get; set; }
    public string last { get; set; }
    public string engagement { get; set; }
    public string drug { get; set; }
    public string adherence { get; set; }
    public string vitals { get; set; }
    public string last_appointment { get; set; }
    public string next_appointment { get; set; }
}

вот мой код разбора:

StreamReader reader = new StreamReader(response.GetResponseStream());

string json = reader.ReadToEnd();

var Jsonobject = JsonConvert.DeserializeObject<PathWayWrapper>(json);

objPathway = Jsonobject.pathway;

person Ehsan Sajjad    schedule 21.02.2014    source источник
comment
Что за исключение?   -  person Ameen    schedule 21.02.2014
comment
Я отформатировал ваш JSON, и, похоже, он не в правильном формате.   -  person Niklas    schedule 21.02.2014
comment
В вашем JSON их нет в конце ]}}}, вам нужно закрыть массив, объект, объект, объект.   -  person Smeegs    schedule 21.02.2014
comment
я исправил это, но все еще не могу разобрать, может кто-нибудь сказать мне, как я это разбираю   -  person Ehsan Sajjad    schedule 21.02.2014
comment
Вам не хватает закрывающих фигурных скобок: 1 ] для массива и 3 } для patients, pathway и общей области.   -  person iggymoran    schedule 21.02.2014
comment
Как вы его разбираете? Вы должны использовать JSON.parse   -  person Smeegs    schedule 21.02.2014
comment
developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/   -  person Smeegs    schedule 21.02.2014
comment
Вы пытаетесь анализировать в C# или jQuery? Что вы пробовали? Опубликуйте свою попытку.   -  person Rick S    schedule 21.02.2014
comment
Используйте jsonlint.com для проверки выходных данных службы.   -  person Jahan    schedule 21.02.2014
comment
Вы можете использовать генератор для проверки правильности вашего json   -  person abhi    schedule 21.02.2014
comment
я написал, что нахожусь на стороне сервера и пытаюсь десериализовать json для сопоставления с объектом моего класса   -  person Ehsan Sajjad    schedule 21.02.2014
comment
@RickS я опубликовал свою попытку, пожалуйста, посмотрите, в чем проблема?   -  person Ehsan Sajjad    schedule 21.02.2014
comment
Классы Paste JSON в Visual Studio идеально подходят для таких вещей. Они создадут объекты POCO из вашего JSON, которые должны быть десериализованы в первый раз.   -  person LDJ    schedule 21.02.2014
comment
@LDJ, я не понял, что ты пытаешься сказать, приведи пример, пожалуйста   -  person Ehsan Sajjad    schedule 22.02.2014


Ответы (1)


Классы, в которые вы десериализуете, неверны. Вам не хватает класса пациентов.

Когда у меня есть JSON и я пытаюсь его десериализовать, мне нравится использовать http://json2csharp.com для создания первого разреза в классы десериализации. Это точнее, чем пытаться сделать это вручную.

var jsonobject = JsonConvert.DeserializeObject<RootObject>(json);

public class Patient
{
    public string patientid { get; set; }
    public string name { get; set; }
    public string status { get; set; }
    public string start { get; set; }
    public string last { get; set; }
    public string engagement { get; set; }
    public string drug { get; set; }
    public string adherence { get; set; }
    public string vitals { get; set; }
    public string last_appointment { get; set; }
    public string next_appointment { get; set; }
}

public class Patients
{
    public List<Patient> patient { get; set; }
}

public class Pathway
{
    public Patients patients { get; set; }
}

public class RootObject
{
    public Pathway pathway { get; set; }
}

P.S. Исключение, которое вы получаете, обычно является действительно хорошим признаком того, что что-то не так с тем, как вы определили классы десериализации.

Невозможно десериализовать текущий объект JSON (например, {имя:значение}) в тип «System.Collections.Generic.List`1[ConsoleApplication1.Program+patient]», поскольку для этого типа требуется массив JSON (например, [1,2,3] ) для правильной десериализации.

Чтобы исправить эту ошибку, либо измените JSON на массив JSON (например, [1,2,3]), либо измените десериализованный тип, чтобы он был обычным типом .NET (например, не примитивный тип, такой как целое число, а не тип коллекции, такой как массив или список), который можно десериализовать из объекта JSON. JsonObjectAttribute также можно добавить к типу, чтобы заставить его десериализоваться из объекта JSON.

person Craig W.    schedule 21.02.2014