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

如何将这个json引入我的c#类,c#,json,C#,Json,我想读一篇关于我的c#类学习和遇到问题的json回复。 这是主要代码: 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

我想读一篇关于我的c#类学习和遇到问题的json回复。 这是主要代码:

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");
此url将返回此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);
我也试过这个

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

这将打印出json中的内容。但是我怎样才能让它进入我的课堂呢?我想不出来。它一定很简单,但我做不好。

您可以使用
JavaScriptSerializer
来实现这一点

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

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

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

var root = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<RootObject>(json);
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”)]


您可以使用
JavaScriptSerializer
实现这一点

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

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

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

var root = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<RootObject>(json);
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”)]


您只需进行如下更改:

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

您只需进行如下更改:

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


您能提供正确的json响应吗?您应该做的一件事是将属性“departuresegment”更改为departuresegment数组。您只需要在末尾添加
]}
。谢谢@DmitryPopov:)您能提供正确的json响应吗?您应该做的一件事是将属性“departuresegment”更改为departuresegment的数组。您只需在末尾添加
]}
。谢谢@DmitryPopov:)我尝试了您的解决方案,它几乎可以工作。不起作用的是在json中使用一个特殊字符命名。Fx@or#name不会得到任何值。有解决方案吗?DataContract需要包括一些使用方法。当我添加它时,它会得到一个错误。你知道要添加什么吗?@user1540911哦,来自
System.Runtime.Serialization
我尝试了你的解决方案,它几乎可以正常工作。不起作用的是在json中使用一个特殊字符命名。Fx@or#name不会得到任何值。有解决方案吗?DataContract需要包括一些使用方法。当我添加它时,它会得到一个错误。你知道要添加什么吗?@user1540911哦,它来自
System.Runtime.Serialization
我刚刚尝试了你的[JsonProperty(“@id”)],但仍然为空。我也会尝试一下Dmitrys的方法,看看它是否有效。当我尝试它时,它是有效的。确保将JsonProperty属性添加到id、x和y属性中。使用JavaScriptSerializer没有什么错,但是Json.net被广泛认为是.net的最佳序列化程序。好的,我正在再次尝试您的解决方案,以使其工作。我改变了你说的话。那么,这个能用吗?List items=JsonConvert.DeserializeObject(json);它应该类似于“var root=JsonConvert.Deserialize(json)”,除非您的响应是一个根对象列表,即:)很不错的。它起作用了。最后一件事。奇怪的迹象,当它读å,ä,ö。在您的案例中,这是如何解决的?我刚刚尝试了您的[JsonProperty(“@id”)],但它仍然为空。我也会尝试一下Dmitrys的方法,看看它是否有效。当我尝试它时,它是有效的。确保将JsonProperty属性添加到id、x和y属性中。使用JavaScriptSerializer没有什么错,但是Json.net被广泛认为是.net的最佳序列化程序。好的,我正在再次尝试您的解决方案,以使其工作。我改变了你说的话。那么,这个能用吗?List items=JsonConvert.DeserializeObject(json);它应该类似于“var root=JsonConvert.Deserialize(json)”,除非您的响应是一个根对象列表,即:)很不错的。它起作用了。最后一件事。奇怪的迹象,当它读å,ä,ö。在你的案例中,这是如何解决的?