作者erspicu (.)
看板C_Sharp
標題[心得] System.Text.Json與Json.NET比較
時間Tue Nov 10 17:59:53 2020
測試JSON
https://github.com/trebonian/visual6502/blob/master/segdefs.js
下載後要移除開頭 "var segdefs =" 字串
json.net 測試環境
.net framework 4.8
nuget 安裝最新 Newtonsoft.Json 12.0.3
try
{
string json_str = File.ReadAllText(Application.StartupPath +
@"\segdefs.js");
object json_obj = JsonConvert.DeserializeObject<object>
( json_str );
Console.WriteLine(st.ElapsedMilliseconds);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
順利parse成物件 經測試能相容 /*....*/ 或是 // js的註解
system.text.json測試環境
.NET Core 3.1
try
{
string json_str = File.ReadAllText(Application.StartupPath +
@"\segdefs.js");
object json_obj =
JsonSerializer.Deserialize<object>(json_str);
Console.WriteLine(st.ElapsedMilliseconds);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
無法處理JS /* .... */ 或是 // 註解 另外PARSE失敗
例外訊息
''' is an invalid start of a value. Path: $ |
LineNumber: 1 | BytePositionInLine: 6.
我是搞不太懂原因 不知道是不是單一資料量太大 或是
SAMPLE檔格式有些規範標準問題
測試過小一點的其他JSON檔是OK
目前測試一下馬上踩雷..... 假若system.text.json處理JSON上有些問題
建議回到JSON.NET試試看
因為連PARSE都有問題 就不做速度上的比較了
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 110.26.164.32 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/C_Sharp/M.1605002396.A.078.html
※ 編輯: erspicu (110.26.164.32 臺灣), 11/10/2020 18:05:56
→ ssccg: JSON parser為什麼要相容JS... 那就不是JSON啊 11/10 18:32
→ ssccg: 因為方便選擇能吃JSON也能吃JS的parser是一回事,不過這是 11/10 18:33
→ ssccg: 資料有問題,不是parser有問題 11/10 18:34
移除掉"var segdefs ="和註解後 就一個塞著json內容的檔案而已
不過JSON.NET比較厲害 還能相容註解
現在的重點是 移除掉註解和"var segdefs ="後
system.text.json照樣PARSE不出來
→ ssccg: 另外那個錯誤訊息是說JSON String只有""沒有'',JS才都有 11/10 18:37
剛用驗證器查一下問題 '+' 要改成 "+" 才能pass 看來JSON.NET寬容很多
理論上JSON定義就是JAVASCRIPT的物件
不過真的JAVASCRIPT內可以用的JSON好像又不一定完全符合某些RFC規範
但很多時候用資料時候會把JS的資料直接挪用過去
看來這時候是JSON.NET好用一點
※ 編輯: erspicu (110.26.164.32 臺灣), 11/10/2020 21:20:54
後續還有一個規範問題 不允許 array , 號後沒有item
把最後多餘的 , 號刪除掉後 範例可以在 system.text.json 上parse
測試速度 system.text.json 效率的確比較好 40ms左右
而Josn.net 大概會在200ms左右 足足快了將近5倍
不過JSON.NET處理寬容度真的高 如果從網路上抓JS內資料要用
遇到一些格式問題懶得修正 大概是JSON.NET理想 速度的話推薦system.text.json
※ 編輯: erspicu (110.26.164.32 臺灣), 11/10/2020 22:55:19
→ ssccg: 你錯了,JSON是從JS來的沒錯,但JSON的定義不是JS的物件 11/11 11:18
→ ssccg: 是有自己一套定義的,而這套定義也不完全是JS的subset 11/11 11:21
→ ssccg: 相容性高是方便,但不見得完全是好處,至少自己一定要清楚 11/11 11:25
→ ssccg: 是哪裡不一樣,不然有時候給別人錯的資料都不知道 11/11 11:25