UWP Json 到 C# 的转换
UWP Json to C# conversion
我想将从网上获取的一些 json 数据序列化到 classes 并使用这些数据,所以我去了 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"}]
对此class:
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 但我的是空的,经过大量搜索我无法找到错误所在。
你的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 class 而不是 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,那么您必须执行以下简单的步骤:
- Right click References and do Add Reference, then from Assemblies->Framework select System.Web.Extensions.
Now you should be able to add the following to your class file:
using System.Web.Script.Serialization;
引自:
我想将从网上获取的一些 json 数据序列化到 classes 并使用这些数据,所以我去了 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"}]
对此class:
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 但我的是空的,经过大量搜索我无法找到错误所在。
你的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 class 而不是 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,那么您必须执行以下简单的步骤:
- Right click References and do Add Reference, then from Assemblies->Framework select System.Web.Extensions.
Now you should be able to add the following to your class file:
using System.Web.Script.Serialization;
引自: