0

Using System.Text.Json and .NET Core 3.1, how can I deserialize the following JSON for a membership:

{
    "id": 123,
    "firstName": "James",
    "lastName": "Smith",
    "group": "Premium"
    "state": "Active"
}

Classes:

public class Membership
{
    public Member Member { get; set; }
    public string Group { get; set; }
    public string State { get; set; }
}

and

public class Member
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

Thanks!

alhazen
  • 1,907
  • 3
  • 22
  • 43
  • 1
    `var parsed = JObject.Parse(json); var membership = parsed.ToObject(); membership.Member = parsed.ToObject();` – Jimi Sep 14 '21 at 03:45
  • If you control the incoming JSON data structure, why not reshape it to match what your client expects? – Andrew H Sep 14 '21 at 15:38

2 Answers2

2

Personally, I would create a POCO / Model to match the Json exactly as it is brought in and deserialize to that. Then add a constructor to your Membership class that accepts the incoming, deserialized json model and builds up your object as desired.

It's an extra step in between getting the json and returning your own model, but since the source (incoming json) doesn't structurally match the destination (your poco object), translation has to happen somewhere. I find it easiest to follow the translation when there is this explicit separation in my code.

Something like this:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.Json;
using System.Text.Json.Serialization;

public class Program
{
        // I wrapped in [] to make a list
        const string inJson = @"[{
            ""id"": 123,
            ""firstName"": ""James"",
            ""lastName"": ""Smith"",
            ""group"": ""Premium"",
            ""state"": ""Active""
        }]";

    public static void Main()
    {
        var deserialized = JsonSerializer.Deserialize<List<JsonMember>>(inJson);
        var asMembership = deserialized.Select(i => new Membership(i)).ToList();
        
        foreach(var m in asMembership){
            Console.WriteLine($"Group: {m.Group}");
            Console.WriteLine($"State: {m.State}");
            Console.WriteLine($"Member Id: {m.Member.Id}");
            Console.WriteLine($"Member First Name: {m.Member.FirstName}");
            Console.WriteLine($"Member Last Name: {m.Member.LastName}");
        }
    }
}

public class JsonMember{
    [JsonPropertyName("id")]
    public int Id { get; set; }

    [JsonPropertyName("firstName")]
    public string FirstName { get; set; }

    [JsonPropertyName("lastName")]
    public string LastName { get; set; }

    [JsonPropertyName("group")]
    public string Group { get; set; }

    [JsonPropertyName("state")]
    public string State { get; set; }
}

public class Membership
{
    public Member Member { get; set; }
    public string Group { get; set; }
    public string State { get; set; }
    
    public Membership(JsonMember jsonMember){
        Group = jsonMember.Group;
        State = jsonMember.State;
        
        Member = new Member{
            Id = jsonMember.Id,
            FirstName = jsonMember.FirstName,
            LastName = jsonMember.LastName
        };
    }
}

public class Member
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

output:

Group: Premium

Group: Active

Member Id: 123

Member First Name: James

Member Last Name: Smith

See: https://dotnetfiddle.net/y0i6Sx

Jonathan
  • 4,916
  • 2
  • 20
  • 37
1

fix your json by adding coma after "Premium"

"group": "Premium",

and try this

   var json=...your json

   var jD= JsonSerializer.Deserialize<Root>(json);

    var memberShip = new Membership
    {
        Member = new Member { FirstName = jD.firstName, LastName = jD.lastName},
        Group=jD.group,
        State=jD.state
     };

  var output= JsonSerializer.Serialize(memberShip);

output

{
  "Member": {
    "Id": 0,
    "FirstName": "James",
    "LastName": "Smith"
  },
  "Group": "Premium",
  "State": "Active"
}

Root class

public class Root
{
    public int id { get; set; }
    public string firstName { get; set; }
    public string lastName { get; set; }
    public string group { get; set; }
    public string state { get; set; }
}
Serge
  • 40,935
  • 4
  • 18
  • 45