我尝试使用JSON数据生成C#类。此数据位于此site
方法1:我使用了这个在线构建器builder online
方法2:我使用特殊粘贴到JSON到Visual Studio 2015(如解释here)
结论:结果不一样!为什么呢?
在线网站的结果:
writeln
使用Visual Studio特殊粘贴的结果:
public class Translations
{
public string de { get; set; }
public string es { get; set; }
public string fr { get; set; }
public string ja { get; set; }
public string it { get; set; }
}
public class RootObject
{
public string name { get; set; }
public List<string> topLevelDomain { get; set; }
public string alpha2Code { get; set; }
public string alpha3Code { get; set; }
public List<object> callingCodes { get; set; }
public string capital { get; set; }
public List<object> altSpellings { get; set; }
public string relevance { get; set; }
public string region { get; set; }
public string subregion { get; set; }
public int population { get; set; }
public List<object> latlng { get; set; }
public string demonym { get; set; }
public double? area { get; set; }
public double? gini { get; set; }
public List<string> timezones { get; set; }
public List<object> borders { get; set; }
public string nativeName { get; set; }
public string numericCode { get; set; }
public List<string> currencies { get; set; }
public List<object> languages { get; set; }
public Translations translations { get; set; }
}
更糟!使用VS代码进行反序列化确实无效!
反序列码:
public class Rootobject
{
public Class1[] Property1 { get; set; }
}
public class Class1
{
public string name { get; set; }
public string[] topLevelDomain { get; set; }
public string alpha2Code { get; set; }
public string alpha3Code { get; set; }
public string[] callingCodes { get; set; }
public string capital { get; set; }
public string[] altSpellings { get; set; }
public string relevance { get; set; }
public string region { get; set; }
public string subregion { get; set; }
public int population { get; set; }
public float?[] latlng { get; set; }
public string demonym { get; set; }
public float? area { get; set; }
public float? gini { get; set; }
public string[] timezones { get; set; }
public string[] borders { get; set; }
public string nativeName { get; set; }
public string numericCode { get; set; }
public string[] currencies { get; set; }
public string[] languages { get; set; }
public Translations translations { get; set; }
}
public class Translations
{
public string de { get; set; }
public string es { get; set; }
public string fr { get; set; }
public string ja { get; set; }
public string it { get; set; }
}
您对这种差异有所了解吗? Bug VS?
答案 0 :(得分:1)
在第二个示例中,Visual Studio实际上包装了&#34;根对象&#34;还有另一个包含Class1数组的根对象。
由于有效负载数据结构root是一个数组,而不是一个对象,如果您使用正确的有效负载生成结构,这似乎是一个错误。
因此,只需将Rootobject
引用替换为Class1
。
string url = @"http://restcountries.eu/rest/v1";
DataContractJsonSerializer serializer =
new DataContractJsonSerializer(typeof(IEnumerable<Class1>));
WebClient syncClient = new WebClient();
string content = syncClient.DownloadString(url);
using (MemoryStream memo = new MemoryStream(Encoding.Unicode.GetBytes(content)))
{
IEnumerable<Class1> countries = (IEnumerable<Class1>)serializer.ReadObject(memo);
int i = countries.Count();
}
Console.Read();
顺便说一句,您应该切换到更现代的序列化程序,例如Newtonsoft JSON.NET。