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

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对象数组的变量:

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

当我尝试像这样反序列化我的JSON时:
MyAdvicesArrays= JsonConvert.DeserializeObject<Advices[]>(sMyJSON));

JSON.Net会将MyAdvicesArrays数组中每个对象的"Phase Name"属性填充为正确的值,但是在运行时检查Advices数组时会出现"无法评估表达式"的错误。我不明白出了什么问题,请问我做错了什么?
3个回答

1

您的json根据实体不是有效的。

在您的类型更改中,将AdvicesList更改为Advices

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

将其更改为

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

“Advices”在我的例子中应该是一个具有字符串属性和数组属性的对象,它怎么可能是List<string>? - Alex

0

不,你的 JSON 和类都是错误的。

首先将你的 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对象。名称可以是任何你想要的。但是任何属性都需要与名称匹配。


谢谢,听起来很合理。这是否意味着我不能在JSON中像我的示例那样拥有未命名的对象数组? [ { "example": 1, "example2": "TestName" }, { "example3": 1, "example4": "TestName" } ] - Alex
不行,因为你的 JSON 对象必须始终以 {} 开头,不能使用 [] 来声明。在初始 {} 后,您必须有一个属性来分配您的第一个数组。 - andy

0
我所做的只是更改Advices类的定义,就使其正常工作了。
public class Advice
{
    public string PhaseName { get; set; }
    public List<string> Advices { get; set; }
}

我将类名更改为Advice,并将AdvicesList属性更改为Advices


我不明白,除了类名和属性名之外,你改变了什么?类定义仍然是一样的。 - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接