如何在C#中反序列化JSON数组

时间:2018-08-30 09:29:39

标签: c#

嗨,我正在用C#开发Web应用程序。我有一个JSON对象。我正在尝试反序列化对象,如下所示。以下是我的结果。

 [ {
    "id": "ce053195-ae48-4457-bb88-6ca32f236bd1",
    "model": {
      "objectId": [
        "c760d95e-3fcb-43d1-a7db-111d3384ecbc"
      ],
      "name": [
        "Device1-Configuration"
      ]
    },
    "childs": 0,
    "access": 0,
    "allow": 0
  },
  {
    "id": "42ad8eb6-9f35-447c-8ea0-e1346dee410c",
    "model": {
      "objectId": [
        "c760d95e-3fcb-43d1-a7db-111d3384ecbc"
      ],
      "name": [
        "Device1-DeviceModel"
      ]
    },
    "childs": 1,
    "access": 0,
    "allow": 0
  }
] 

下面是我的模特。

public partial class Resource
{
    public System.Guid Id { get; set; }

    public Models Model { get; set; }

    public bool Selected { get; set; }

    public bool hasChildren { get; set; }

    public bool IsAllowed { get; set; }
}

下面是我的模型课。

public partial class Models
{
    public List<string> Name { get; set; }
}

我正在尝试从模型中分配名称数组。

foreach (JObject singScopeRes in result)
{
    var permission = new Rbac.BusinessEntities.V2.Resource();
    permission.Id = new Guid(singScopeRes["id"].ToString());
    permission.Model = new Rbac.BusinessEntities.V2.Models()
    {
        Name= singScopeRes["model"]["name"][0]
    };
 }

这将引发错误:

  

不能将类型newtonsoft.json.linq.jtoken隐式转换为system.generic.list

有人可以帮助我解决此问题吗?

2 个答案:

答案 0 :(得分:4)

使用json2csharp之类的工具来生成模型:

var i = E5KDAQ.E5K_GetRunTimeOS();

现在您可以像这样反序列化json:

public class Model
{
    public List<string> objectId { get; set; }
    public List<string> name { get; set; }
}

public class Resource
{
    public string id { get; set; }
    public Model model { get; set; }
    public int childs { get; set; }
    public int access { get; set; }
    public int allow { get; set; }
}

如果要坚持使用当前代码,可以通过在将var obj = JsonConvert.DeserializeObject<Resource[]>(json); 属性分配给JToken属性的同时投射Name来实现:

foreach (JObject singScopeRes in result)
{
    var permission = new Rbac.BusinessEntities.V2.Resource();
    permission.Id = new Guid(singScopeRes["id"].ToString());
    permission.Model = new Rbac.BusinessEntities.V2.Models()
    {
        Name = (singScopeRes["model"]["name"]).ToObject<List<string>>()
    };
 }

答案 1 :(得分:0)

您可以尝试将JSON转换为dynamic,然后如下遍历这些值:dynamic obj = JsonConvert.DeserializeObject(JSON);

另一种选择是使您的对象具有与JSON相同的结构。

public class Model
{
    public List<string> objectId { get; set; }
    public List<string> name { get; set; }
}

public class Resource
{
    public string id { get; set; }
    public Model model { get; set; }
    public int childs { get; set; }
    public int access { get; set; }
    public int allow { get; set; }
}