区别JSON反序列化'在线网站' vs'粘贴到Visual studio'

时间:2017-06-02 20:01:53

标签: c# json visual-studio visual-studio-2015

我尝试使用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?

1 个答案:

答案 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。