【C#实战】SimpleJSON字典反序列化

8 篇文章 0 订阅

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

看到这里估计你就应该明白为什么这么写了。祝编程愉快!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值