基于Json.net的省市县三级联动WinForm制作

本文介绍了如何在C#.net环境下使用Json.net库进行JSON的解析和创建。JSON是一种轻量级的数据交换格式,常用于跨语言通信。文中详细阐述了JSON的基本格式,包括名称/值对、值的类型、对象和数组,并通过示例展示了Json.net库的使用,如解析JSON对象和数组。
摘要由CSDN通过智能技术生成
这是最近接到的一个小任务的前期准备工作,后面最终实现是在ArcGis的Arctoolbox中,即自定义一个GP工具(这个之后再写)。简单的来说就是要实现三个下拉框(在C#.net中就是combobox),第一个下拉框选择省级单位,第二框根据第一个框的结果更新出市级单位,第三个框根据市级单位更新出县级单位,最后实现的效果如下所示:



其实是一个非常常见的小程序,比如在淘宝买东西设置地址时用到就是和这个类似的。虽然最后的核心代码就那么小几十行,但是对理解JSON作用很大,所以先写下来,给以后要用JSON时作为一个回顾。

一、关于JSON

之前写手机APP的服务器时用过,实际上可以理解为一种跨语言的数据格式,以字符串形式传递,是比XML更加轻量级的格式。当然用JSON最好的地方必然是Javascript,用在其他语言时往往需要一些类库的支持来解析这种格式。一般的解析有两种,一种是已知JSON格式的字符串,怎么方便从里面取得想要的信息;二是,已经有一些组织好的信息,怎么用JSON去包装。下面的文章主要是解决第一个问题,但是实际上Json.net还有很多复杂特性包括怎么与LINQ结合,或者怎么直接转化C#的对象等等,希望以后有时间可以学习,下面就对这次开发中涉及到的JSON的一些特性做备忘记录。

1、JSON的基本格式

JSON 名称/值对

JSON 数据的书写格式是:名称/值对。

名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值:

"firstName" : "John"

这很容易理解,等价于这条 JavaScript 语句:

firstName = "John"

JSON 值

JSON 值可以是:

  • 数字(整数或浮点数)
  • 字符串(在双引号中)
  • 逻辑值(true 或 false)
  • 数组(在方括号中)
  • 对象(在花括号中)
  • null

JSON 对象

JSON 对象在花括号中书写:

对象可以包含多个名称/值对:

{ "firstName":"John" , "lastName":"Doe" }

这一点也容易理解,与这条 JavaScript 语句等价:

firstName = "John"
lastName = "Doe"

JSON 数组

JSON 数组在方括号中书写:

数组可包含多个对象:

{
"employees": [
{ "firstName":"John" , "lastName":"Doe" },
{ "firstName":"Anna" , "lastName":"Smith" },
{ "firstName":"Peter" , "lastName":"Jones" }
]
}

在上面的例子中,对象 "employees" 是包含三个对象的数组。每个对象代表一条关于某人(有姓和名)的记录。


2、C#.net环境下的JSON解析

这次主要使用了一个json.net的开源类库,这个类库功能比以前在Java里用的那个要强大很多,但是遗憾的是,这次开发只用了很少数的几个特性。使用时就是添加引用,但注意要选择本机的.net的版本(随便打开一个文件夹,在地址栏输入  %systemroot%\Microsoft.NET\Framework,按下确定键,选择最高的)。使用时注意,一些常用的,像JObject、JArray都在Newtonsoft.Json.Linq这个命名空间下。主要功能及代码:

(1)解析JSON对象

</pre><pre name="code" class="csharp">JObject jo = JObject.Parse("JSON格式的字符串");
(2)从JSON对象取值

string value = jo["key"].ToString();

(3)遍历JSON对象的键、值(这个非常有用!)

 foreach (KeyValuePair<string, JToken> keyValuePair in jo) {this.City.Items.Add(keyValuePair.Key); }//keyValuePair.Key可以取出键,keyValuePair.Value可以取出值

(4)解析JSON数组

 Newtonsoft.Json.Linq.JArray jarray = Newtonsoft.Json.Linq.JArray.Parse("JSON数组格式字符串");

(5)遍历JSON数组

 for (int i = 0; i < jarray.Count; i++)
            {
                this.County.Items.Add(jarray[i].ToString());
            }

二、项目代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;

namespace SelectArea
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            string jsonText = "{\"北京市\":{\"市辖区\":[\"东城区\",\"西城区\",\"崇文区\",\"宣武区\",\"朝阳区\",\"丰台区\",\"石景山区\",\"海淀区\",\"门头沟区\",\"房山区\",\"通州区\",\"顺义区\",\"昌平区\",\"大兴区\",\"怀柔区\",\"平谷区\"],\"县\":[\"密云县\",\"延庆县\"]},\"天津市\":{\"市辖区\":[\"和平区\",\"河东区\",\"河西区\",\"南开区\",\"河北区\",\"红桥区\",\"塘沽区\",\"汉沽区\",\"大港区\",\"东丽区\",\"西青区\",\"津南区\",\"北辰区\",\"武清区\",\"宝坻区\"],\"县\":[\"宁河县\",\"静海县\",\"蓟县\"]},\"河北省\":{\"石家庄市\":[\"长安区\",\"桥东区\",\"桥西区\",\"新华区\",\"井陉矿区\",\"裕华区\",\"井陉县\",\"正定县\",\"栾城县\",\"行唐县\",\"灵寿县\",\"高邑县\",\"深泽县\",\"赞皇县\",\"无极县\",\"平山县\",\"元氏县\",\"赵县\",\"辛集市\",\"藁城市\",\"晋州市\",\"新乐市\",\"鹿泉市\"],\"唐山市\":[\"路南区\",\"路北区\",\"古冶区\",\"开平区\",\"丰南区\",\"丰润区\",\"滦县\",\"滦南县\",\"乐亭县\",\"迁西县\",\"玉田县\",\"唐海县\",\"遵化市\",\"迁安市\"],\"秦皇岛市\":[\"海港区\",\"山海关区\",\"北戴河区\",\"青龙满族自治县\",\"昌黎县\",\"抚宁县\",\"卢龙县\"],\"邯郸市\":[\"邯山区\",\"丛台区\",\"复兴区\",\"峰峰矿区\",\"邯郸县\",\"临漳县\",\"成安县\",\"大名县\",\"涉县\",\"磁县\",\"肥乡县\",\"永年县\",\"邱县\",\"鸡泽县\",\"广平县\",\"馆陶县\",\"魏县\",\"曲周县\",\"武安市\"],\"邢台市\":[\"桥东区\",\"桥西区\",\"邢台县\",\"临城县\",\"内丘县\",\"柏乡县\",\"隆尧县\",\"任县\",\"南和县\",\"宁晋县\",\"巨鹿县\",\"新河县\",\"广宗县\",\"平乡县\",\"威县\",\"清河县\",\"临西县\",\"南宫市\",\"沙河市\"],\"保定市\":[\"新市区\",\"北市区\",\"南市区\",\"满城县\",\"清苑县\",\"涞水县\",\"阜平县\",\"徐水县\",\"定兴县\",\"唐县\",\"高阳县\",\"容城县\",\"涞源县\",\"望都县\",\"安新县\",\"易县\",\"曲阳县\",\"蠡县\",\"顺平县\",\"博野县\",\"雄县\",\"涿州市\",\"定州市\",\"安国市\",\"高碑店市\"],\"张家口市\":[\"桥东区\",\"桥西区\",\"宣化区\",\"下花园区\",\"宣化县\",\"张北县\",\"康保县\",\"沽源县\",\"尚义县\",\"蔚县\",\"阳原县\",\"怀安县\",\"万全县\",\"怀来县\",\"涿鹿县\",\"赤城县\",\"崇礼县\"],\"承德市\":[\"双桥区\",\"双滦区\",\"鹰手营子矿区\",\"承德县\",\"兴隆县\",\"平泉县\",\"滦平县\",\"隆化县\",\"丰宁满族自治县\",\"宽城满族自治县\",\"围场满族蒙古族自治县\"],\"沧州市\":[\"新华区\",\"运河区\",\"沧县\",\"青县\",\"东光县\",\"海兴县\",\"盐山县\",\"肃宁县\",\"南皮县\",\"吴桥县\",\"献县\",\"孟村回族自治县\",\"泊头市\",\"任丘市\",\"黄骅市\",\"河间市\"],\"廊坊市\":[\"安次区\",\"广阳区\",\"固安县\",\"永清县\",\"香河县\",\"大城县\",\"文安县\",\"大厂回族自治县\",\"霸州市\",\"三河市\"],\"衡水市\":[\"桃城区\",\"枣强县\",\"武邑县\",\"武强县\",\"饶阳县\",\"安平县\",\"故城县\",\"景县\",\"阜城县\",\"冀州市\",\"深州市\"]},\"山西省\":{\"太原市\":[\"小店区\",\"迎泽区\",\"杏花岭区\",\"尖草坪区\",\"万柏林区\",\"晋源区\",\"清徐县\",\"阳曲县\",\"娄烦县\",\"古交市\"],\"大同市\":[\"城区\",\"矿区\",\"南郊区\",\"新荣区\",\"阳高县\",\"天镇县\",\"广灵县\",\"灵丘县\",\"浑源县\",\"左云县\",\"大同县\"],\"阳泉市\":[\"城区\",\"矿区\",\"郊区\",\"平定县\",\"盂县\"],\"长治市\":[\"城区\",\"郊区\",\"长治县\",\"襄垣县\",\"屯留县\",\"平顺县\",\"黎城县\",\"壶关县\",\"长子县\",\"武乡县\",\"沁县\",\"沁源县\",\"潞城市\"],\"晋城市\":[\"城区\",\"沁水县\",\"阳城县\",\"陵川县\",\"泽州县\",\"高平市\"],\"朔州市\":[\"朔城区\",\"平鲁区\",\"山阴县\",\"应县\",\"右玉县\",\"怀仁县\"],\"晋中市\":[\"榆次区\",\"榆社县\",\"左权县\",\"和顺县\",\"昔阳县\",\"寿阳县\",\"太谷县\",\"祁县\",\"平遥县\",\"灵石县\",\"介休市\"],\"运城市\":[\"盐湖区\",\"临猗县\",\"万荣县\",\"闻喜县\",\"稷山县\",\"新绛县\",\"绛县\",\"垣曲县\",\"夏县\",\"平陆县\",\"芮城县\",\"永济市\",\"河津市\"],\"忻州市\":[\"忻府区\",\"定襄县\",\"五台县\",\"代县\",\"繁峙县\",\"宁武县\",\"静乐县\",\"神池县\",\"五寨县\",\"岢岚县\",\"河曲县\",\"保德县\",\"偏关县\",\"原平市\"],\"临汾市\":[\"尧都区\",\"曲沃县\",\"翼城县\",\"襄汾县\",\"洪洞县\",\"古县\",\"安泽县\",\"浮山县\",\"吉县\",\"乡宁县\",\"大宁县\",\"隰县\",\"永和县\",\"蒲县\",\"汾西县\",\"侯马市\",\"霍州市\"],\"吕梁市\":[\"离石区\",\"文水县\",\"交城县\",\"兴县\",\"临县\",\"柳林县\",\"石楼县\",\"岚县\",\"方山县\",\"中阳县\",\"交口县\",\"孝义市\",\"汾阳市\"]},\"内蒙古自治区\":{\"呼和浩特市\":[\"新城区\",\"回民区\",\"玉泉区\",\"赛罕区\",\"土默特左旗\",\"托克托县\",\"和林格尔县\",\"清水河县\",\"武川县\"],\"包头市\":[\"东河区\",\"昆都仑区\",\"青山区\",\"石拐区\",\"白云矿区\",\"九原区\",\"土默特右旗\",\"固阳县\",\"达尔罕茂明安联合旗\"],\"乌海市\":[\"海勃湾区\",\"海南区\",\"乌达区\"],\"赤峰市\":[\"红山区\",\"元宝山区\",\"松山区\",\"阿鲁科尔沁旗\",\"巴林左旗\",\"巴林右旗\",\"林西县\",\"克什克腾旗\",\"翁牛特旗\",\"喀喇沁旗\",\"宁城县\",\"敖汉旗\"],\"通辽市\":[\"科尔沁区\",\"科尔沁左翼中旗\",\"科尔沁左翼后旗\",\"开鲁县\",\"库伦旗\",\"奈曼旗\",\"扎鲁特旗\",\"霍林郭勒市\"],\"鄂尔多斯市\":[\"东胜区\",\"达拉特旗\",\"准格尔旗\",\"鄂托克前旗\",\"鄂托克旗\",\"杭锦旗\",\"乌审旗\",\"伊金霍洛旗\"],\"呼伦贝尔市\":[\"海拉尔区\",\"阿荣旗\",\"莫力达瓦达斡尔族自治旗\",\"鄂伦春自治旗\",\"鄂温克族自治旗\",\"陈巴尔虎旗\",\"新巴尔虎左旗\",\"新巴尔虎右旗\",\"满洲里市\",\"牙克石市\",\"扎兰屯市\",\"额尔古纳市\",\"根河市\"],\"巴彦淖尔市\":[\"临河区\",\"五原县\",\"磴口县\",\"乌拉特前旗\",\"乌拉特中旗\",\"乌拉特后旗\",\"杭锦后旗\"],\"乌兰察布市\":[\"集宁区\",\"卓资县\",\"化德县\",\"商都县\",\"兴和县\",\"凉城县\",\"察哈尔右翼前旗\",\"察哈尔右翼中旗\",\"察哈尔右翼后旗\",\"四子王旗\",\"丰镇市\"],\"兴安盟\":[\"乌兰浩特市\",\"阿尔山市\",\"科尔沁右翼前旗\",\"科尔沁右翼中旗\",\"扎赉特旗\",\"突泉县\"],\"锡林郭勒盟\":[\"二连浩特市\",\"锡林浩特市\",\"阿巴嘎旗\",\"苏尼特左旗\",\"苏尼特右旗\",\"东乌珠穆沁旗\",\"西乌珠穆沁旗\",\"太仆寺旗\",\"镶黄旗\",\"正镶白旗\",\"正蓝旗\",\"多伦县\"],\"阿拉善盟\":[\"阿拉善左旗\",\"阿拉善右旗\",\"额济纳旗
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值