API 回傳 JSON 結構中 data 欄位為二維陣列,內層陣列僅包含值而無鍵名:
{
"Infor": {
"tradeCode": "5040010",
"mess": "成功",
"data": [
["801", "玉璜", "2114-10-01", "訂單", "5.29", "3.91", ...],
["802", "雙龍玉璜", "2114-10-01", "訂單", "5.17", "3.82", ...]
],
...
}
}
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 | 無需定義類別 | 無編譯期檢查、效能較差 | 一次性腳本、探索性開發 |
ContractResolver 忽略大小寫response?.Infor?.data 避免 NullReferenceException面對無 Key 的 JSON 陣列,List<List<string>> 是最直接的對應模型。專案成熟後建議引入自訂 JsonConverter 升級為強型別實體,兼顧開發效率與程式碼品質。