简体   繁体   中英

How to de-serialize JSON array in c#

Hi I am developing web application in c#. I have one JSON object. I am trying to de-serialize the object as below. Below is my result.

 [ {
    "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
  }
] 

Below are my models.

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; }
}

Below is my model class.

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

I am trying to assign name array from the models.

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]
    };
 }

This is throwing error saying:

cannot implicit convert type newtonsoft.json.linq.jtoken to system.generic.list

Can someone help me to fix this issue?

Use a tool like json2csharp to generate your model:

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; }
}

Now you can deserialize your json like this:

var obj = JsonConvert.DeserializeObject<Resource[]>(json);

If you want to stick with your current code you can do so by casting the JToken while assigning it to the Name property:

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>>()
    };
 }

You could try to Convert your JSON to an dynamic and then loop over those values as following: dynamic obj = JsonConvert.DeserializeObject(JSON);

Another option is to make your Objects have the same structure as the 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; }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM