如何用Newtonsoft.Json获取反序列化后单个订单的原始JSON片段
嗨,这个需求我之前也碰到过,用Newtonsoft.Json完全可以轻松实现,给你两个实用的方案,你可以根据自己的场景来选:
方案1:直接解析JSON节点提取原始片段
这个方案最直接,不需要修改现有模型,先把整个响应解析成JObject,然后遍历订单数组里的每个节点,直接转成JSON字符串保存即可:
// 把整个响应字符串解析成JObject var responseJObject = JObject.Parse(responseString); // 从JObject中取出Orders数组(注意键名要和API返回的一致) var ordersJArray = (JArray)responseJObject["Orders"]; foreach (var orderJToken in ordersJArray) { // 获取当前订单的原始JSON字符串,Formatting.Indented会让JSON更易读,不需要的话用Formatting.None var originalOrderJson = orderJToken.ToString(Formatting.Indented); // 把JToken反序列化成你的Order对象进行后续处理 var order = orderJToken.ToObject<models.Order>(); // 检查订单状态是否符合要求 if (order.Status.ToLower() == orderStatusToImport.ToLower()) { // 这里可以把originalOrderJson保存到文件、数据库或者其他地方 // SaveOriginalJson(originalOrderJson); // 执行你的订单导入逻辑 ImportOrder(order, param1, param2, out result); } }
这个方案的好处是能完整保留每个订单的原始JSON结构,哪怕你的Order模型没有定义某些字段,原始JSON里的内容也不会丢失,非常灵活。
方案2:给订单模型绑定原始JSON(持久化关联)
如果你希望把订单对象和它的原始JSON绑定在一起,后续处理时随时能拿到原始数据,可以给Order模型加一个属性,配合自定义转换器实现:
首先修改你的Order模型,新增一个存储原始JSON的属性:
public class Order { // 你的原有属性 public string Status { get; set; } public string Name { get; set; } public string LastName { get; set; } public int ItemId { get; set; } // 新增属性:存储原始JSON,用[JsonIgnore]避免反序列化时循环处理 [JsonIgnore] public string OriginalJson { get; set; } }
然后创建一个自定义的JSON转换器:
public class OrderWithOriginalJsonConverter : JsonConverter<Order> { public override Order ReadJson(JsonReader reader, Type objectType, Order existingValue, bool hasExistingValue, JsonSerializer serializer) { // 读取当前订单的JSON节点为JObject var jObject = JObject.Load(reader); // 把JObject转成JSON字符串 var originalJson = jObject.ToString(Formatting.Indented); // 反序列化成Order对象 var order = jObject.ToObject<Order>(); // 给新增的属性赋值 order.OriginalJson = originalJson; return order; } public override void WriteJson(JsonWriter writer, Order value, JsonSerializer serializer) { // 如果需要序列化Order对象,直接输出原始JSON writer.WriteRawValue(value.OriginalJson); } }
最后在反序列化时使用这个转换器:
// 配置序列化设置,添加自定义转换器 var serializerSettings = new JsonSerializerSettings(); serializerSettings.Converters.Add(new OrderWithOriginalJsonConverter()); // 注意:API返回的是包裹在Orders里的结构,所以需要定义一个根对象模型 var root = JsonConvert.DeserializeObject<RootOrderResponse>(responseString, serializerSettings); var processableOrders = root.Orders.Where(o => o.Status.ToLower() == orderStatusToImport.ToLower()); foreach (var order in processableOrders) { // 这里order.OriginalJson就是当前订单的原始JSON片段 // SaveOriginalJson(order.OriginalJson); ImportOrder(order, param1, param2, out result); } // 根对象模型,对应API返回的结构 public class RootOrderResponse { public List<Order> Orders { get; set; } }
这个方案适合需要长期关联订单对象和原始数据的场景,后续操作订单时不用再单独查找对应的JSON。
内容的提问来源于stack exchange,提问作者Paramone
相关产品推荐
相关产品推荐

