Попытка получить набор результатов в C # со страницы php — не работает

У меня есть функция в C #, которая загружает объект JSON со страницы PHP, и она работает нормально, если она содержит только одну запись. Я читаю JSON в словарь.

using (WebClient webClient = new System.Net.WebClient())
{
WebClient n = new WebClient();
var json = n.DownloadString("http://127.0.0.1/testjson.php");

Dictionary<string, string> htmlAttributes = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, string>>(json);

int ID = Int32.Parse(htmlAttributes["id"]);
string Phone = htmlAttributes["phone"];
string Message = htmlAttributes["message"];
string UID = htmlAttributes["uid"];

Console.WriteLine(ID);
Console.WriteLine(Phone);
Console.WriteLine(Message);
Console.WriteLine(UID);
}

Это прекрасно работает, если я использую объекты JSON, как показано ниже:

{"id":26333,"phone":"+46734231233","message":"Testmeddelande","uid":"A774059B-69CE-40D7-809B-C0A63728F5B9"}

Но когда я хочу проанализировать более одной записи, я получаю ошибки — и эта ошибка:

Newtonsoft.Json.JsonReaderException: ‘При синтаксическом анализе значения обнаружен неожиданный символ: [. Путь «данные», строка 1, позиция 9.

Объект JSON выглядит следующим образом, и я проверил его в Интернете:

{"data":[{"id":26333,"phone":"+46734231233","message":"Testmeddelande","uid":"A774059B-69CE-40D7-809B-C0A63728F5B9"},{"id":26333,"phone":"+46734231233","message":"Wow, det fungerar","uid":"CA528FCA-CD5D-4220-A646-B556FC060550"}]}

Я новичок, поэтому решение может быть очевидным?

С наилучшими пожеланиями, Йоаким

0

Решение

Вместо преобразования объекта json в объект словаря вы можете создать конкретный класс, как показано ниже:

public class DataObject // name it properly
{
public int id { get; set; }
public string phone { get; set; }
public string message { get; set; }
public string uid { get; set; }
}

public class DataList
{
public List<DataObject> data { get; set; }
}

И при десериализации,

DataList objDataList = Newtonsoft.Json.JsonConvert.DeserializeObject<DataList>(json);

И во время итерации или извлечения данных,

foreach(DataObject objData in objDataList.data)
{
Console.WriteLine(objData.ID);
Console.WriteLine(objData.Phone);
Console.WriteLine(objData.Message);
Console.WriteLine(objData.UID);
}

Надеюсь, поможет.

2

Другие решения

Лучшим решением было бы скопировать образец JSON, который вы хотите десериализовать и использовать вставить специальную Особенность Visual Studio:

введите описание изображения здесь

Вы получите следующий сгенерированный код:

public class Rootobject
{
public Datum[] data { get; set; }
}

public class Datum
{
public int id { get; set; }
public string phone { get; set; }
public string message { get; set; }
public string uid { get; set; }
}

После генерации просто используйте следующее для десериализации и дальнейшего использования:

string json = "{\"data\":[{\"id\":26333,\"phone\":\"+46734231233\",\"message\":\"Testmeddelande\",\"uid\":\"A774059B-69CE-40D7-809B-C0A63728F5B9\"},{\"id\":26333,\"phone\":\"+46734231233\",\"message\":\"Wow, det fungerar\",\"uid\":\"CA528FCA-CD5D-4220-A646-B556FC060550\"}]}";
Rootobject htmlAttributes = Newtonsoft.Json.JsonConvert.DeserializeObject<Rootobject>(json);

int ID = htmlAttributes.data[0].id;
string Phone = htmlAttributes.data[0].phone;
string Message = htmlAttributes.data[0].message;
string UID = htmlAttributes.data[0].uid;
2

По вопросам рекламы [email protected]