You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:35:04