我如何将这个json带入我的c#类

时间:2014-12-10 12:51:06

标签: c# json

我想在json中阅读我的c#课程,以便学习并解决问题。 这是主要代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.IO;
using Newtonsoft.Json;


namespace ConsoleApplication2
{
class Program
{
    static void Main(string[] args)
    {

       var webClient = new System.Net.WebClient();
        var json = webClient.DownloadString("https://api.trafiklab.se/samtrafiken/resrobotstops/GetDepartures.json?key=[KEY]&apiVersion=2.2&locationId=7420752&coordSys=RT90");

此网址将返回此json

{"getdeparturesresult":{"departuresegment":[{"departure":{"location":
{"@id":"7420752","@x":"1271307","@y":"6404493","name":"Göteborg Brunnsparken"}
 ,"datetime":"2014-12-10 12:27"},"direction":"Göteborg Kålltorp","segmentid":
 {"mot":{"@displaytype":"S","@type":"SLT","#text":"Spårvagn"},"carrier":
 {"name":"Västtrafik","url":"http:\/\/www.vasttrafik.se\/","id":"279","number":"3"}}}, 

第一个问题是,在生成c#类时,它会在变量名中抱怨@。怎么解决这个问题?我的意思是我无法改变json的责任。这就是我得到的。我猜是这样的:

getdeparturesresult.departuresegment.departure.location["@x"]);

第二个是我将如何写入我的课程?应该使用什么?

我试过这个但是它会抱怨我的RootObject:

string json = r.ReadToEnd();
List<RootObject> items = JsonConvert.DeserializeObject<List<RootObject>>(json);

假设我有一个这样的课程

 public class Location
    {
        public string id { get; set; }
        public string x { get; set; }
        public string y { get; set; }
        public string name { get; set; }
    }

    public class Departure
    {
        public Location location { get; set; }
        public string datetime { get; set; }
    }

    public class Mot
    {
        public string displaytype { get; set; }
        public string type { get; set; }
        public string text { get; set; }
    }

    public class Carrier
    {
        public string name { get; set; }
        public string url { get; set; }
        public string id { get; set; }
        public string number { get; set; }
    }

    public class Segmentid
    {
        public Mot mot { get; set; }
        public Carrier carrier { get; set; }
    }

    public class Departuresegment
    {
        public Departure departure { get; set; }
        public string direction { get; set; }
        public Segmentid segmentid { get; set; }
    }

    public class Getdeparturesresult
    {
        public Departuresegment departuresegment { get; set; }
    }

    public class RootObject
    {
        public Getdeparturesresult getdeparturesresult { get; set; }
    }

我也试过这个

 dynamic array = JsonConvert.DeserializeObject(json);
  foreach (var item in array)
   {
        Console.WriteLine("{0}", item);
   }

这将打印出json中的内容。但是如何将它读入我的班级呢?我弄清楚了。它必须简单,但我无法做到。

2 个答案:

答案 0 :(得分:3)

你只需改变:

public class Getdeparturesresult
{
   public IEnumerable<Departuresegment> departuresegment { get; set; }
}

您仍然可以使用Json.net序列化程序(JsonConvert)。

编辑: 处理&#34; @ id&#34;财产,你可以这样做:

[JsonProperty("@id")]
public string id { get; set; }

答案 1 :(得分:1)

您可以使用JavaScriptSerializer完成此操作。

var root = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<RootObject>(json);

它对我有用,但我必须将Getdeparturesresult.departuresegment属性的类型更改为数组:

public class Getdeparturesresult
{
    public Departuresegment[] departuresegment { get; set; }
}

<强>更新

要使用.NET使用特殊字符反序列化JSON属性,可以使用DataContractJsonSerializer

RootObject root;

using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(json)))
    root = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(RootObject)).ReadObject(stream) as RootObject;

但是你的代码必须得到冗长。您需要使用[DataContract]标记每个类,并使用[DataMember]属性标记每个属性。对于名称与源名称不相同的属性,请使用[DataMember(Name = "@fancy_name")]

[DataContract]
public class Location
{
    [DataMember(Name = "@id")]
    public string id { get; set; }
    [DataMember(Name = "@x")]
    public string x { get; set; }
    [DataMember(Name = "@y")]
    public string y { get; set; }
    [DataMember]
    public string name { get; set; }
}

// etc.