JSON.Net,JsonConvert.DeserializeObject - 反序列化的问题

时间:2012-11-02 04:17:06

标签: c# json json.net deserialization

当我尝试使用JSON.Net反序列化我的JSON时,它为JSON数组提供了无效值。

我有简单的JSON:

[
{
    "PhaseName": "Start",
    "Advices": ["Lorem ipsum dolor",
    "Lorem ipsum dolor",
    "Lorem ipsum dolor"]
},
{
    "PhaseName": "In Progress",
    "Advices": ["Lorem ipsum dolor",
    "Lorem ipsum dolor",
    "Lorem ipsum dolor"]
},
{
    "PhaseName": "Finish",
    "Advices": ["Lorem ipsum dolor",
    "Lorem ipsum dolor",
    "Lorem ipsum dolor"]
}

我代码中的通讯员:

public class Advices
{
    public string PhaseName { get; set; }
    public List<string> AdvicesList { get; set; }
}

一个可靠的代表一组Advices对象:

public class MyAdvices
{
    private Advices[] MyAdvicesArrays;
....

所以,当我试图像我那样反序列化我的JSON时:

MyAdvicesArrays= JsonConvert.DeserializeObject<Advices[]>(sMyJSON));

JSON.Net使用正确的值填充MyAdvicesArrays数组中每个对象的“Phase Name”属性,但每个对象的Advices数组无效:“如果在运行时检查它们,则无法计算表达式”。我不明白。我做错了什么?

3 个答案:

答案 0 :(得分:1)

根据实体,您的json无效。

在您的类型更改AdvicesListAdvices

public List<string> AdvicesList { get; set; }

将其更改为

public List<string> Advices { get; set; }

答案 1 :(得分:0)

不,你的JSON和Class一样不正确。

首先将您的JSON更改为:

{
    phases:[
        {
            "PhaseName": "Start",
            "Advices": ["Lorem ipsum dolor",
            "Lorem ipsum dolor",
            "Lorem ipsum dolor"]
        },
        {
            "PhaseName": "In Progress",
            "Advices": ["Lorem ipsum dolor",
            "Lorem ipsum dolor",
            "Lorem ipsum dolor"]
        },
        {
            "PhaseName": "Finish",
            "Advices": ["Lorem ipsum dolor",
            "Lorem ipsum dolor",
            "Lorem ipsum dolor"]
        }
    ]
}

在您未正确声明JSON对象之前请注意。你还需要一个数组属性。

现在你需要两个班级:

public class AnythinYouWant{
    public List<Phase> Phases{get;set;}
}

public class Phase{
    public string PhaseName{get;set;}
    public List<string> Advices{get;set;}
}

注意第一个类是如何用于顶级JSON对象的。这个名字可以是你想要的任何名字。但任何财产都需要与名称相匹配。

答案 2 :(得分:0)

我所做的就是改变Advices类的定义:

public class Advice
{
    public string PhaseName { get; set; }
    public List<string> Advices { get; set; }
}

我将班级名称更改为Advice,将AdvicesList属性更改为Advices