首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Newtonsoft从我的JSON数组反序列化为其值为C# .NET中的“资源”对象的字典数组?

如何使用Newtonsoft从我的JSON数组反序列化为其值为C# .NET中的“资源”对象的字典数组?
EN

Stack Overflow用户
提问于 2016-10-11 14:42:13
回答 2查看 261关注 0票数 1

当我试图将我的JSON合并到一个Dictionary<string, Resources>[]中时,我得到了以下错误:

Newtonsoft.Json.JsonSerializationException类型的未处理异常发生在Newtonsoft.Json.dll中 其他信息:无法将当前JSON对象(例如,{“名称”:“值”})反序列化为'System.Collections.Generic.Dictionary`2System.String,MyProject.Resource‘类型,因为该类型需要一个JSON数组(例如,1,2,3)才能正确反序列化。 要修复此错误,要么将JSON更改为JSON数组(例如,1,2,3),要么更改反序列化类型,使之成为可以从JSON对象反序列化的普通.NET类型(例如,不像整数这样的原始类型,而不是数组或列表之类的集合类型)。还可以将JsonObjectAttribute添加到类型中,以强制它从JSON对象反序列化。

我的Program.Main():

代码语言:javascript
复制
    public class Program
            {
                public static void Main(string[] Args)
                {
                    var options = new Options()
                    {
                        Option1 = "foo",
                        Option2 = "bar",
                        Resources = JsonConvert.DeserializeObject<Dictionary<string, Resource>[]>(resources.json)
                    };
                }
            }

我的resources.json:

代码语言:javascript
复制
{
    "global": [

        {
            "title": "global1",
            "url": "~/global1"
        },
        {
            "title": "global2",
            "url": "~/global2"
        }
    ],
    "ACC": [
        {
            "title": "acc1",
            "url": "~/acc1/"
        },
        {
            "title": "acc2",
            "url": "~/acc2/"
        }
    ],
    "ECC": [
        {
            "title": "ecc1",
            "url": "~/ecc1/"
        },
        {
            "title": "ecc2",
            "url": "~/ecc2/"
        }
    ],
    "ECB": [
        {
            "title": "ecb1",
            "url": "~/ecb1"
        }
    ]

}

我的资源课:

代码语言:javascript
复制
public class Resource
    {
        public List<string> titles { get; set; }

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

我的选项课:

代码语言:javascript
复制
public class Options
    {
        public string Option1 { get; set; }
        public string Option2 { get; set; }
        public Dictionary<string, Resource>[] Resources { get; set; }
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-11 17:55:07

JSON并不表示字典(Dictionary<string, Resource>[])数组,而是表示数组字典(Dictionary<string, Resource[]>)。这就是为什么你要得到错误。

此外,还需要像这样定义Resource类以匹配JSON:

代码语言:javascript
复制
public class Resource
{
    public string Title { get; set; }
    public string Url { get; set; }
}

然后您可以像这样反序列化:

代码语言:javascript
复制
 Resources = JsonConvert.DeserializeObject<Dictionary<string, Resource[]>>(resources.json)

见小提琴:https://dotnetfiddle.net/8s2eQd

票数 1
EN

Stack Overflow用户

发布于 2016-10-11 14:52:52

你的Json和你的班级结构不匹配。

如果要保持类的结构,json必须如下所示:

代码语言:javascript
复制
{
   "global":{
      "titles":[
         "global1",
         "global2"
      ],
      "urls":[
         "~/global1",
         "~/global2"
      ]
   },
   "acc":{
      "titles":[
         "acc1",
         "acc2"
      ],
      "urls":[
         "~/acc1",
         "~/acc2"
      ]
   },

   ...    

}

如果您无法影响您的json文件(无论出于什么原因),您的类结构必须如下所示:

代码语言:javascript
复制
public class Rootobject
{
   public Global[] global { get; set; }
   public ACC[] ACC { get; set; }
   public ECC[] ECC { get; set; }
   public ECB[] ECB { get; set; }
}

public class Global
{
   public string title { get; set; }
   public string url { get; set; }
}

public class ACC
{
   public string title { get; set; }
   public string url { get; set; }
}

public class ECC
{
   public string title { get; set; }
   public string url { get; set; }
}

public class ECB
{
   public string title { get; set; }
   public string url { get; set; }
}

然后您可以这样反序列化它:

代码语言:javascript
复制
Resources = JsonConvert.DeserializeObject<Rootobject>(resources.json)

下一次请注意:

如果您不确定类结构的外观(关于json字符串),可以复制json字符串并转到:

Visual ->编辑->粘贴特殊->粘贴为类

Visual将组成适当的类结构。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39979932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档