如何将AWS AppSync订阅返回的JSON解析为C#的onPublishResult对象
在C#中将AWS AppSync订阅返回的JSON映射到onPublishResult对象的实现方式
你当前的C#类结构和AppSync返回的JSON存在层级不匹配问题:返回的JSON最外层直接是onPublish字段,而onPublishResult类的结构是onPublishResult -> data -> onPublish -> Change。以下是两种可行的实现方案:
方案一:通过序列化特性调整属性映射
无论是使用Newtonsoft.Json(Json.NET)还是System.Text.Json,都可以通过特性标记让类属性和JSON字段直接对应,无需手动转换。
使用Newtonsoft.Json的实现
给类的属性添加JsonProperty特性,指定对应的JSON键名:
using Newtonsoft.Json; public class Change { [JsonProperty("name")] public string name { get; set; } [JsonProperty("messageName")] public string messageName { get; set; } [JsonProperty("data")] public string data { get; set; } } public class onPublishData { [JsonProperty("onPublish")] public Change onPublish { get; set; } } public class onPublishResult { // 将data属性映射到JSON最外层的"onPublish"字段 [JsonProperty("onPublish")] public onPublishData data { get; set; } }
执行反序列化:
// 替换为你实际获取到的JSON字符串 string appSyncJson = @" { ""onPublish"": { ""data"": ""[{\""sourceId\":1003,\""reasonCode\":\""NoError\",\""changeType\":\""Updated\",\""data\":null,\""pId\":3,\""changeDateTime\":\""2023-07-03T17:53:32.797452Z\",\""errorMessage\":null}]"", ""messageName"": ""reportStatusChange"", ""name"": ""*******"" } }"; onPublishResult result = JsonConvert.DeserializeObject<onPublishResult>(appSyncJson);
使用System.Text.Json的实现
如果项目使用.NET Core/.NET 5+自带的System.Text.Json,添加JsonPropertyName特性即可:
using System.Text.Json.Serialization; public class Change { [JsonPropertyName("name")] public string name { get; set; } [JsonPropertyName("messageName")] public string messageName { get; set; } [JsonPropertyName("data")] public string data { get; set; } } public class onPublishData { [JsonPropertyName("onPublish")] public Change onPublish { get; set; } } public class onPublishResult { [JsonPropertyName("onPublish")] public onPublishData data { get; set; } }
反序列化代码:
string appSyncJson = @"你的JSON字符串"; onPublishResult result = System.Text.Json.JsonSerializer.Deserialize<onPublishResult>(appSyncJson);
方案二:通过临时类手动转换
如果不想修改原有类的结构,可以定义一个和JSON结构完全匹配的临时类,反序列化后再手动映射到onPublishResult对象:
// 临时类,完全匹配返回的JSON结构 public class TempAppSyncResponse { public Change onPublish { get; set; } } // 反序列化并转换 string appSyncJson = @"你的JSON字符串"; TempAppSyncResponse tempResponse = JsonConvert.DeserializeObject<TempAppSyncResponse>(appSyncJson); onPublishResult finalResult = new onPublishResult { data = new onPublishData { onPublish = tempResponse.onPublish } };
内容的提问来源于stack exchange,提问作者user3097695
相关产品推荐
相关产品推荐

