背景:我正在嘗試遍歷這個 json 示例并將值插入到 mysql 資料庫中。我遇到的問題是他們使用陣列標題的日期和值作為字串。
示例 Json:
{
"options":
{
"2022-03-04":
{
"c":
{
"200.00":
{
"oi": 0,
"l": 635,
"b": 636.85,
"a": 640.2,
"v": 10
},
"250.00":
{
"oi": 2,
"l": 594.1,
"b": 586.85,
"a": 590.2,
"v": 5
}
},
"p":
{
"200.00":
{
"oi": 2150,
"l": 0.03,
"b": 0,
"a": 0.01,
"v": 11
},
"250.00":
{
"oi": 518,
"l": 0.01,
"b": 0,
"a": 0.01,
"v": 0
}
}
},
"2022-03-11":
{
"c":
{
"200.00":
{
"oi": 0,
"l": 631.65,
"b": 637.2,
"a": 639.85,
"v": 1
},
"250.00":
{
"oi": 5,
"l": 596.7,
"b": 587.2,
"a": 589.85,
"v": 5
}
},
"p":
{
"200.00":
{
"oi": 1138,
"l": 0.01,
"b": 0,
"a": 0.01,
"v": 39
},
"250.00":
{
"oi": 371,
"l": 0.01,
"b": 0,
"a": 0.01,
"v": 65
}
}
}
}
}
示例代碼:
$stock = @(get-content -path ./stock_symbol.json | convertfrom-json)
如果我這樣做,結果陣列長度被認為是 1,因為資料的雙重配額和“c”或“p”(200 或 250)的值似乎被認為是一個字串。
通常我可以通過陣列做一個while回圈或指定第一個或第二個,
$stock.options[0] or $stock.options[1]但是這兩個命令都會吐出整個選項陣列部分
陣列輸出
目標 我希望能夠提取到期日期、型別 (c/p)、罷工 (價值)、出價 (b) 和要價 (a)。
這將是我想在資料庫中插入的示例:
結果在電子表格視圖中
任何幫助/提示表示贊賞
uj5u.com熱心網友回復:
這是一個非常復雜的 Json,您可以通過以下方式獲取您正在尋找的資訊,您可以看到這需要許多嵌套回圈:
$table = foreach($a in $json.options.PSObject.Properties) {
$expiration = $a.Name
foreach($b in $a.Value.PSObject.Properties) {
$type = $b.Name
foreach($c in $b.Value.PSObject.Properties) {
$strike = $c.Name
$bid = $c.Value.b
$ask = $c.Value.a
[pscustomobject]@{
Symbol = 'Stock' # => This is not on the Json!
Expiration = [datetime]$expiration
Type = ('Call', 'Pull')[$type -eq 'p']
Strike = [decimal]$price
Bid = [decimal]$bid
Ask = [decimal]$ask
}
}
}
}
$table | Format-Table -AutoSize
這將導致一個扁平的物件陣列,可以輕松地匯出到 CSV/插入到 SQL 表中。
Symbol Expiration Type Strike Bid Ask
------ ---------- ---- ------ --- ---
Stock 3/4/2022 12:00:00 AM Call 250 636.85 640.2
Stock 3/4/2022 12:00:00 AM Call 250 586.85 590.2
Stock 3/4/2022 12:00:00 AM Pull 250 0 0.01
Stock 3/4/2022 12:00:00 AM Pull 250 0 0.01
Stock 3/11/2022 12:00:00 AM Call 250 637.2 639.85
Stock 3/11/2022 12:00:00 AM Call 250 587.2 589.85
Stock 3/11/2022 12:00:00 AM Pull 250 0 0.01
Stock 3/11/2022 12:00:00 AM Pull 250 0 0.01
uj5u.com熱心網友回復:
嘗試在 MySQL 中執行此操作失敗(僅在我的站點上???):
WITH RECURSIVE cte1 AS (
SELECT 0 as x
UNION ALL
SELECT x 1 FROM cte1 WHERE x<10)
SELECt
JSON_UNQUOTE(d) d,
JSON_EXTRACT(@json,CONCAT("$.options.",d,".c")) c,
JSON_EXTRACT(@json,CONCAT("$.options.",d,".p")) p
FROM (
SELECT JSON_EXTRACT(
(SELECT JSON_EXTRACT(JSON_KEYS(JSON_EXTRACT(@json, '$.options')),"$[*]")),
CONCAT("$[",x,"]")) as d
FROM cte1
) xx
WHERE not d is null
這會產生:
| d | C | p |
|---|---|---|
| 2022-03-04 | {“200.00”:{“a”:640.2,“b”:636.85,“l”:635,“v”:10,“oi”:0},“250.00”:{“a”:590.2,“b “:586.85,“l”:594.1,“v”:5,“oi”:2}} | {“200.00”:{“a”:0.01,“b”:0,“l”:0.03,“v”:11,“oi”:2150},“250.00”:{“a”:0.01,“b “:0,“l”:0.01,“v”:0,“oi”:518}} |
| 2022-03-11 | {“200.00”:{“a”:639.85,“b”:637.2,“l”:631.65,“v”:1,“oi”:0},“250.00”:{“a”:589.85,“b “:587.2,“l”:596.7,“v”:5,“oi”:5}} | {“200.00”:{“a”:0.01,“b”:0,“l”:0.01,“v”:39,“oi”:1138},“250.00”:{“a”:0.01,“b “:0,“l”:0.01,“v”:65,“oi”:371}} |
那就是我停下來的地方......
DBFIDDLE (對于任何敢于完成此任務的人...... )
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/438177.html
上一篇:NewtonsoftJson.NETJSONProperty()需要是任意亂數
下一篇:使用gson決議嵌套的json
