我想在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中的内容。但是如何将它读入我的班级呢?我弄清楚了。它必须简单,但我无法做到。
答案 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.