首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 反序列化無 Key 純 Value JSON 陣列至 List<T> 完整實作

     編輯:程式設計綜合問答

問題場景

API 回傳 JSON 結構中 data 欄位為二維陣列,內層陣列僅包含值而無鍵名:

{
  "Infor": {
    "tradeCode": "5040010",
    "mess": "成功",
    "data": [
      ["801", "玉璜", "2114-10-01", "訂單", "5.29", "3.91", ...],
      ["802", "雙龍玉璜", "2114-10-01", "訂單", "5.17", "3.82", ...]
    ],
    ...
  }
}

解決方案:對應至 List<List<string>>

Newtonsoft.Json 可直接將無鍵名陣列反序列化為 List<List<string>>。

實體類別定義

public class InforData
{
    public string tradeCode { get; set; }
    public string mess { get; set; }
    public List> data { get; set; } // 關鍵:二維字串清單
    public string sid { get; set; }
    public string ver { get; set; }
    // 其他欄位...
}

public class ApiResponse
{
    public InforData Infor { get; set; }
}

反序列化程式碼

using Newtonsoft.Json;

string json = /* 你的 JSON 字串 */;
ApiResponse response = JsonConvert.DeserializeObject(json);

if (response?.Infor?.data != null)
{
    foreach (var row in response.Infor.data)
    {
        // row 為 List,可直接索引或迭代
        Console.WriteLine(string.Join(" | ", row));
        
        // 範例:依索引取值
        string id = row[0];
        string name = row[1];
        string date = row[2];
        // ...
    }
}

進階:對應至強型別實體

若需更強型別,可撰寫自訂 JsonConverter 將內層陣列轉換為具名物件:

public class TradeRecord
{
    public string Id { get; set; }
    public string Name { get; set; }
    public DateTime Date { get; set; }
    public string Type { get; set; }
    public decimal Price1 { get; set; }
    public decimal Price2 { get; set; }
    // 其他屬性...
}

public class TradeRecordConverter : JsonConverter
{
    public override TradeRecord ReadJson(JsonReader reader, Type objectType, TradeRecord existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        var arr = JArray.Load(reader);
        return new TradeRecord
        {
            Id = arr[0].Value(),
            Name = arr[1].Value(),
            Date = DateTime.Parse(arr[2].Value()),
            Type = arr[3].Value(),
            Price1 = arr[4].Value(),
            Price2 = arr[5].Value()
            // 依序映射...
        };
    }

    public override void WriteJson(JsonWriter writer, TradeRecord value, JsonSerializer serializer)
    {
        var arr = new JArray
        {
            value.Id, value.Name, value.Date.ToString("yyyy-MM-dd"),
            value.Type, value.Price1, value.Price2
        };
        arr.WriteTo(writer);
    }
}

// 使用方式
public class InforData
{
    [JsonConverter(typeof(TradeRecordConverter))]
    public List data { get; set; }
}

效能與記憶體考量

方案優點缺點適用場景
List<List<string>>零成本、直接對應、彈性高無語意、索引易出錯快速原型、欄位頻繁變動
自訂 Converter + 強型別型別安全、IntelliSense、可驗證需維護映射邏輯正式專案、長期維護
dynamic / JArray無需定義類別無編譯期檢查、效能較差一次性腳本、探索性開發

常見錯誤排查

  • JSON 格式錯誤:確認字串為合法 JSON(雙引號、無尾隨逗號)
  • 屬性名稱大小寫:預設區分大小寫,可設定 ContractResolver 忽略大小寫
  • Null 參考:務必檢查 response?.Infor?.data 避免 NullReferenceException

結語

面對無 Key 的 JSON 陣列,List<List<string>> 是最直接的對應模型。專案成熟後建議引入自訂 JsonConverter 升級為強型別實體,兼顧開發效率與程式碼品質。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved