JSON解析C#没有名称变量

时间:2016-01-12 11:01:52

标签: c# json

我试图将Json String反序列化为一个对象,但我只得到0并返回null。

这是我的代码:

string result = "[{\"page\":1,\"pages\":1,\"per_page\":\"50\",\"total\":1},[{\"id\":\"BEL\",\"iso2Code\":\"BE\",\"name\":\"Belgium\",\"region\":{ \"id\":\"ECS\",\"value\":\"Europe & Central Asia(all income levels)\"},\"adminregion\":{ \"id\":\"\",\"value\":\"\"},\"incomeLevel\":{ \"id\":\"OEC\",\"value\":\"High income: OECD\"},\"lendingType\":{ \"id\":\"LNX\",\"value\":\"Not classified\"},\"capitalCity\":\"Brussels\",\"longitude\":\"4.36761\",\"latitude\":\"50.8371\"}]]";

var serializer = new DataContractJsonSerializer(typeof(LandRootObject));

var ms = new MemoryStream(Encoding.UTF8.GetBytes(result));

var data = (LandRootObject)serializer.ReadObject(ms);


public class LandRootObject
{
    public int page { get; set; }
    public int pages { get; set; }
    public string per_page { get; set; }
    public int total { get; set; }

    [DataMember]
    public List<Land> land { get; set; }
}

谢谢!

3 个答案:

答案 0 :(得分:1)

使用List类型

var serializer = new DataContractJsonSerializer(typeof(List<LandRootObject>));
// ...
var data = (List<LandRootObject>)serializer.ReadObject(ms);

修改 现在我看到了 - 你的json数组由2个不同的元素组成。我想它是[RootObject, Lands]。最好使用Newtonsoft.Json反序列化对象。

var str = "[{\"page\":1,\"pages\":1,\"per_page\":\"50\",\"total\":1},[{\"id\":\"BEL\",\"iso2Code\":\"BE\",\"name\":\"Belgium\",\"region\":{ \"id\":\"ECS\",\"value\":\"Europe & Central Asia(all income levels)\"},\"adminregion\":{ \"id\":\"\",\"value\":\"\"},\"incomeLevel\":{ \"id\":\"OEC\",\"value\":\"High income: OECD\"},\"lendingType\":{ \"id\":\"LNX\",\"value\":\"Not classified\"},\"capitalCity\":\"Brussels\",\"longitude\":\"4.36761\",\"latitude\":\"50.8371\"}]]";
var arr = JArray.Parse(str);
var rootJson = arr.ElementAt(0).ToString();
var root = JsonConvert.DeserializeObject<LandRootObject>(rootJson);
var landsJson = arr.ElementAt(1).ToString();
root.Lands = JsonConvert.DeserializeObject<List<Land>>(landsJson);

答案 1 :(得分:1)

我已经测试了这种方法并且它正在运行。

您的实体类。 (我没有对所有这些类进行编码。它们是使用paste special生成的代码。)

public class LandRootObject
{
    public int page { get; set; }
    public int pages { get; set; }
    public string per_page { get; set; }
    public int total { get; set; }
}

public class LandBodyObject
{
    public string id { get; set; }
    public string iso2Code { get; set; }
    public string name { get; set; }
    public Region region { get; set; }
    public Adminregion adminregion { get; set; }
    public Incomelevel incomeLevel { get; set; }
    public Lendingtype lendingType { get; set; }
    public string capitalCity { get; set; }
    public string longitude { get; set; }
    public string latitude { get; set; }
}

public class Region
{
    public string id { get; set; }
    public string value { get; set; }
}

public class Adminregion
{
    public string id { get; set; }
    public string value { get; set; }
}

public class Incomelevel
{
    public string id { get; set; }
    public string value { get; set; }
}

public class Lendingtype
{
    public string id { get; set; }
    public string value { get; set; }
}

然后是反序列化方法。你的Json有两个部分。因此,我将其拆分为2以进行反序列化。

    string result = "[{\"page\":1,\"pages\":1,\"per_page\":\"50\",\"total\":1},[{\"id\":\"BEL\",\"iso2Code\":\"BE\",\"name\":\"Belgium\",\"region\":{ \"id\":\"ECS\",\"value\":\"Europe & Central Asia(all income levels)\"},\"adminregion\":{ \"id\":\"\",\"value\":\"\"},\"incomeLevel\":{ \"id\":\"OEC\",\"value\":\"High income: OECD\"},\"lendingType\":{ \"id\":\"LNX\",\"value\":\"Not classified\"},\"capitalCity\":\"Brussels\",\"longitude\":\"4.36761\",\"latitude\":\"50.8371\"}]]";

    var parts = result.Split(new[] {",["}, StringSplitOptions.None);
    if (parts.Length > 1)
    {
        var header = parts[0].Replace("[", "");
        var jsonHeader = JsonConvert.DeserializeObject<LandRootObject>(header);

        var body = "[" + parts[1].Replace("]]","]");
        var jsonBody = JsonConvert.DeserializeObject<List<LandBodyObject>>(body);
    }

答案 2 :(得分:0)

  

尝试将上述代码更改为以下

   ms.Position = 0;   // change only this line
   var data = (LandRootObject)serializer.ReadObject(ms);