У меня есть функция в 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"}]}
Я новичок, поэтому решение может быть очевидным?
С наилучшими пожеланиями, Йоаким
Вместо преобразования объекта 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);
}
Надеюсь, поможет.
Лучшим решением было бы скопировать образец 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;