c# - 使用 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; }
}
谢谢!
解决方案
就个人而言,我会创建一个 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
成员名字:詹姆斯
成员姓氏:史密斯
推荐阅读
- c - 如何使用llvm插入指令?
- python - 如果代码运行良好,为什么会出现列表索引错误?
- reactjs - 使用弹出后如何在 create-react-app 中使用 less?
- c# - 如何将空间(地理)矢量数据导入 Unity?
- flutter - 颤振错误,我的手机没有响应,从来没有
- javascript - 向多个生成的元素添加事件侦听器
- linux - 查找不以指定字符串结尾的文本文件的快速方法
- android - Android - 如何在自定义视图上实现 android:onClick?
- javascript - 如何在 Typescript 中生成 * 数组
- javascript - clearTimeout 在递归函数中不起作用