1

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?

1

2 Answers 2

4

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>>()
    };
 }
Sign up to request clarification or add additional context in comments.

7 Comments

Thanks. When i convert i am getting error cannot convert from system.collections.generic<object> to string
Visual studio can create models as well. Copy your JSON, then in Visual studio Do Edit -> Paste Special -> Paste JSON as Classes. Unfortunately it creates arrays instead of lists.
@Niranjan Are you using this exact model? I cannot reproduce this error. For me the deserialization works like a charm.
Yes. But i am getting error cannot convert from system.collections.generic<object> to string
@Niranjan Are you using the same json to test the deserialization as you provided in your question?
|
0

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

3 Comments

Thanks. When i convert i am getting error cannot convert from system.collections.generic<object> to string
I checked with dynamic also but same error is popping up
Where do you get this exception. Since if it happens in your foreach then just remove this part of code. Becuase this has been filled in already due to the deserialize done by @croxy his code.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.