c# 解析json道路千万条,其中最流行的还是由newtonsoft出品的json.net,只需要将json的结构做成c#的class,即可实现完美的序列化和反序列化。更重要的是它还支持linq。
product product = new product(); product.name = "apple"; product.expiry = new datetime(2008, 12, 28); product.sizes = new string[] { "small" }; string json = jsonconvert.serializeobject(product); // { // "name": "apple", // "expiry": "2008-12-28t00:00:00", // "sizes": [ // "small" // ] // }
string json = @"{ 'name': 'bad boys', 'releasedate': '1995-4-7t00:00:00', 'genres': [ 'action', 'comedy' ] }"; movie m = jsonconvert.deserializeobject<movie>(json); string name = m.name; // bad boys
jarray array = new jarray(); array.add("manual text"); array.add(new datetime(2000, 5, 23)); jobject o = new jobject(); o["myarray"] = array; string json = o.tostring(); // { // "myarray": [ // "manual text", // "2000-05-23t00:00:00" // ] // }
但也不妨有同志因为sdk大小等种种原因寻求一个轻量替代方案,simplejson就是其中一个选择,只用一个c#脚本就干完了json解析的事儿。
simplejson的用法很简单,(当然老规矩,还得是基于我的一个开源项目来讲,欢迎点个star)先读出来json字符串,然后用jsonnode.parse(你的字符串)即可获得反序列化json文件后的根节点。
public static void initialize() { configuration = jsonnode.parse(file.readalltext("appsettings.json")); }
如上面代码所示,我的json字符串在一个叫appsettings.json文件里,文件内容如下:
{ "discord": { "token": "your-bot-token", "channel": "your-channel-id", "logchannel": "your-bot-log-channel-id (leave it empty if you dont want log. )" }, "unity": [ { "2022.3.14f1": "e:\\program files\\unity 2022.3.14f1\\editor\\unity.exe" } ], "projects": [ { "name": "example", "path": "d:\\unity_projects\\example", "unityversion": "2022.3.14f1", "playerbuildoutput": "d:\\unity_projects\\example\\build", "addressablebuildoutput": "d:\\unity_projects\\example\\serverdata" } ], "ssh": { "address": "", "user": "", "password": "", "privatekeypath": "", "keepaliveinterval": "-1", "expectedfingerprints": [] } }
其中unity节点下是一个列表,列表相当于是一个dictionary<string, jsonnode>,我们得稍微处理一下。
editorinstallations = new dictionary<string, string>(); foreach (jsonnode node in configurationutility.configuration["unity"].asarray) { foreach (var kvp in node) { editorinstallations.add(kvp.key, kvp.value.value); _logger.loginformation($"[{gettype()}] found a unity editor installation! {kvp.key}, {kvp.value}"); } }
对于这种列表的情况,simplejson给我们预留了jsonarray,里面包含了jsonnode列表。
我们再进到jsonnode去看,你会发现jsonnode其实是有keyvaluepair的。
key是一个string,也就是字段名,value还是一个jsonnode,至于怎么处理value里的东西就看当时怎么规定的类型了。如果是string,那就直接拿jsonnode的value就可以了。
⚠重要提醒:有同志用tostring习惯了直接就上去用了,这是不太对的。虽说simplejson的确实现了tostring方法,但其实干的事情和函数名不是完全一致,它实际上是返回了json字符串,和我们理解的string的不同点在于它返回的字符串的开头和结尾会带着双引号!请务必注意这一点,除非你有特殊需求,否则请直接从jsonnode.value拿。关于这块的更详细解释,请见此issue。
到此这篇关于c# simplejson字典反序列化的文章就介绍到这了,更多相关c# simplejson反序列化内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论