UWP Json для преобразования C#
Я хочу сериализовать некоторые данные json, которые я получаю из Интернета, в классы и использовать эти данные, поэтому я пошел на http://json2csharp.com/ и включил json, как показано ниже
json: [{"line_descr":"\u03a0\u0395\u0399\u03a1\u0391\u0399\u0391\u03a3 -
\u0392\u039f\u03a5\u039b\u0391","line_descr_eng":"PEIRAIAS - VOYLA"}]
К этому классу:
public class RootObject
{
public string line_descr { get; set; }
public string line_descr_eng { get; set; }
}
Это мой код:
class LineName
{
public async static Task<RootObject> GetLineName(int linecode)
{
var http = new HttpClient();
var response = await http.GetAsync("http://telematics.oasa.gr/api/?act=getLineName&p1=962");
var result = await response.Content.ReadAsStringAsync();
var serializer = new DataContractJsonSerializer(typeof(RootObject));
var ms = new MemoryStream(Encoding.UTF8.GetBytes(result));
var data = (RootObject)serializer.ReadObject(ms);
return data;
}
}
[DataContract]
public class RootObject
{
[DataMember]
public string line_descr { get; set; }
[DataMember]
public string line_descr_eng { get; set; }
}
private async void Button_Click(object sender, RoutedEventArgs e)
{
RootObject myLine = await LineName.GetLineName(92);
ResultTextBlock.Text = myLine.line_descr_eng;
}
Поэтому, когда я пытаюсь получить данные и отобразить их в своем текстовом блоке, я получаю сообщение об ошибке: line_descr_eng равно нулю.
Может кто-то указать, где вина? так как line_descr_eng должно быть PEIRAIAS - VOYLA, но у меня пустое значение, и после долгих поисков я не могу найти причину ошибки.
2 ответа
Ваш json - это массив, а не объект, и вы должны десериализовать его в массив.
public async static Task<RootObject[]> GetLineName(int linecode)
{
var http = new HttpClient();
var response = await http.GetAsync("http://telematics.oasa.gr/api/?act=getLineName&p1=962");
var result = await response.Content.ReadAsStringAsync();
var serializer = new DataContractJsonSerializer(typeof(RootObject[]));
var ms = new MemoryStream(Encoding.UTF8.GetBytes(result));
var data = (RootObject[])serializer.ReadObject(ms);
return data;
}
//...
var myLines = await LineName.GetLineName(92);
var myLine = myLines.FirstOrDefault();
Также вам не нужен поток памяти, вы можете прочитать поток из ответа HTTP
var result = await response.Content.ReadAsStreamAsync();
Вы просто можете использовать класс JavaScriptSerializer вместо DataContractJsonSerializer следующим образом:
Заменить:
var serializer = new DataContractJsonSerializer(typeof(RootObject));
var ms = new MemoryStream(Encoding.UTF8.GetBytes(result));
var data = (RootObject)serializer.ReadObject(ms);
с этим:
var ser = new JavaScriptSerializer();
var test = ser.Deserialize<List<RootObject>>(json);
Если вы не можете найти JavaScriptSerializer, вам нужно выполнить следующие простые шаги:
- Щелкните правой кнопкой мыши на References и сделайте Add Reference, затем в Assemblies->Framework выберите System.Web.Extensions.
Теперь вы сможете добавить следующее в ваш файл класса:
using System.Web.Script.Serialization;
Цитируется по адресу: /questions/7271157/ne-udaetsya-najti-javascriptserializer-vnet-40/7271163#7271163