UWP Json 到 C# 的转换

Posted

技术标签:

【中文标题】UWP Json 到 C# 的转换【英文标题】:UWP Json to C# conversion 【发布时间】:2017-11-28 02:06:57 【问题描述】:

我想把我从网上得到的一些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 但我的是空的,经过大量搜索后我找不到故障所在。

【问题讨论】:

【参考方案1】:

你的 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();

【讨论】:

好的,我试过了,但它说它不能将 RootObject[] 转换为 RootObject 错误是在“返回数据”。能再具体一点吗?? :) @PanosPanosAthanasiou 编辑了帖子。基本上你需要改变方法的返回类型和变量的类型来匹配新的数据类型。 好的,成功了^_^ thnx!!只是第二个 var 需要与第一个不同的名称 :) 所以基本上我们返回一个数组,然后我们只从该数组中获取第一项,对吗? @PanosPanosAthanasiou 是的,您的 json 是一个编码数组,此代码将其解码为数组并获取它的第一个元素,如果数组为空,则返回 null。 好的,再次感谢您的回答,我能够解决所有问题^_^ !!【参考方案2】:

您可以像这样使用 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;
    

引用自:https://***.com/a/15391388/5056173

【讨论】:

以上是关于UWP Json 到 C# 的转换的主要内容,如果未能解决你的问题,请参考以下文章

UWP C# 将 png 转换为 pdf

如何将 C# UWP 应用程序的非 UI 部分转换为 JavaScript?

UWP流到浮点数组c#

如何将 SoftwareBitmap 对象保存到 bmp 文件 C#,UWP

c#中JSON字符串到CSV和CSV到JSON的转换

将 json 转换为 C# 数组?