Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Json isn't Deserializing

I’m using System.Text.Json.

I have the following models:

public  class Contacts
{
    [JsonPropertyName("id")]
    public long Id { get; set; }
    [JsonPropertyName("name")]
    public string Name { get; set; } = string.Empty;
    [JsonPropertyName("paused")]
    public bool Paused { get; set; }
    [JsonPropertyName("type")]
    public string Type { get; set; } = string.Empty;
    [JsonPropertyName("owner")]
    public bool Owner {  get; set; }
    [JsonPropertyName("notification_targets")]
    public NotificationTargets? NotificationTargets { get; set; }
    [JsonPropertyName("teams")]
    public List<Teams>? Teams { get; set; }
}
public class NotificationTargets
{
    [JsonPropertyName("email")]
    public List<Email>? Email {  get; set; }
}
public class Email
{
    [JsonPropertyName("severity")]
    public string Severity { get; set; } = string.Empty;
    [JsonPropertyName("address")]
    public string Address { get; set; } = string.Empty;
}
public class Teams
{
    [JsonPropertyName("id")]
    public long Id { get; set; }
    [JsonPropertyName ("name")]
    public string Name { get; set; } = string.Empty;
}

My Json is:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

{
    "contacts": [
        {
            "id": 14960844,
            "name": "firstname test",
            "paused": false,
            "type": "user",
            "owner": true,
            "notification_targets": {
                "email": [
                    {
                        "severity": "HIGH",
                        "address": "firstname@test.co.uk"
                    }
                ]
            },
            "teams": [
                {
                    "id": 804736,
                    "name": "Team 1"
                }
            ]
        }
    ]
}

The above is stored in a string variable.

And I just call:

var myContacts = JsonSerializer.Deserialize<List<Contacts>>(myJsonString);

and I keep receiving the following error:

System.Text.Json.JsonException: ‘The JSON value could not be converted
to System.Collections.Generic.List`1[VTMShared.Models.Contacts]. Path:
$ | LineNumber: 0 | BytePositionInLine: 1.’

I really cannot see what is wrong with this.

>Solution :

You need to deserialize as the Root and extract the Contacts from the Root instance.

var root = JsonSerializer.Deserialize<Root>(json);
var contacts = root.Contacts;
public class Root
{
    [JsonPropertyName("contacts")]
    public List<Contact> Contacts { get; set; }
}

public  class Contact
{
    [JsonPropertyName("id")]
    public long Id { get; set; }
    [JsonPropertyName("name")]
    public string Name { get; set; } = string.Empty;
    [JsonPropertyName("paused")]
    public bool Paused { get; set; }
    [JsonPropertyName("type")]
    public string Type { get; set; } = string.Empty;
    [JsonPropertyName("owner")]
    public bool Owner {  get; set; }
    [JsonPropertyName("notification_targets")]
    public NotificationTargets? NotificationTargets { get; set; }
    [JsonPropertyName("teams")]
    public List<Teams>? Teams { get; set; }
}

Without defining the Root class, you can work with JsonDocument:

var root = JsonDocument.Parse(json);
var contacts = root.RootElement.GetProperty("contacts").Deserialize<List<Contact>>();
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading