首页 > 解决方案 > 使用 System.Text.Json 自定义反序列化 - 将字段分组到对象中

问题描述

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

谢谢!

标签: c#json-deserialization.net-core-3.1system.text.json

解决方案


就个人而言,我会创建一个 POCO / 模型来完全匹配 Json,因为它被引入并反序列化。然后向您的Membership类添加一个构造函数,该构造函数接受传入的反序列化 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; }
}

输出:

组: 高级

组:活跃

会员编号:123

成员名字:詹姆斯

成员姓氏:史密斯

请参阅: https ://dotnetfiddle.net/y0i6Sx


推荐阅读