使用 System.Text.Json 的自定义反序列化 - 将字段分组到对象中

Custom deserialization with System.Text.Json - Grouping fields into object

使用 System.Text.Json 和 .NET Core 3.1,我如何为成员反序列化以下 JSON:

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

类:

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

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

谢谢!

就我个人而言,我会创建一个 POCO / 模型来完全匹配 Json 并对其进行反序列化。然后向您的 Membership class 添加一个构造函数,它接受传入的反序列化 json 模型并根据需要构建您的对象。

这是获取 json 和返回您自己的模型之间的额外步骤,但由于源(传入 json)在结构上与目标(您的 poco 对象)不匹配,翻译必须在某处发生。当我的代码中有这种明确的分隔时,我发现最容易理解翻译。

像这样:

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

输出:

Group: Premium

Group: Active

Member Id: 123

Member First Name: James

Member Last Name: Smith

见: https://dotnetfiddle.net/y0i6Sx

通过在“Premium”之后添加逗号来修复您的 json

"group": "Premium",

试试这个

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

输出

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

根目录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; }
}