3

当我尝试使用 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 对象数组的 veriable:

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

因此,当我尝试像这样反序列化我的 JSON 时:

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

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

4

3 回答 3

1

根据实体,您json是无效的。

在您的类型中更改AdvicesListAdvices.

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

将其更改为

public List<string> Advices { get; set; }
于 2012-11-02T04:24:37.677 回答
0

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

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

我将类名更改为 justAdvice并将AdvicesList属性更改为Advices.

于 2012-11-02T04:38:59.043 回答
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 对象的。名字可以是任何你想要的。但是任何属性都需要与名称匹配。

于 2012-11-02T04:34:10.680 回答