这里使用LitJson.dll作json解析。

微信规定的自定义菜单json样式如下:

 {
"button":[
{
"type":"click",
"name":"今日歌曲",
"key":"V1001_TODAY_MUSIC"
},
{
"type":"click",
"name":"歌手简介",
"key":"V1001_TODAY_SINGER"
},
{
"name":"菜单",
"sub_button":[
{
"type":"view",
"name":"搜索",
"url":"http://www.soso.com/
"
},
{
"type":"view",
"name":"视频",
"url":"http://v.qq.com/
"
},
{
"type":"click",
"name":"赞一下我们",
"key":"V1001_GOOD"
}]
}]
}

首先定义Menu类:

// 自定义菜单实体类
public class Menu
{
public string type { get; set; }
public string name { get; set; }
public string key { get; set; }
public string url { get; set; }
public bool IsSub = false;
public IListsub_button = new List();
}

写好实体类后,就来编写解析为json的方法,自定义菜单的数量和类型无法确定,所以使用List<Menu>来作为方法的参数,这里需要引用using LitJson;

// 根据Menu列表生成符合微信规范的创建菜单JSon
//一级菜单不超过3个,二级菜单不超过5个
//微信唯一标示
//菜单列表,type为click时url留空,view时key留空
public string CreateMenuJson(IListmunuList)
{
JsonData jd = new JsonData();
jd["button"] = new JsonData();
foreach (Menu menu in munuList)
{
if (menu.IsSub)
{
JsonData json = new JsonData();
json["name"] = menu.name;
json["sub_button"] = new JsonData();
foreach (Menu item in menu.sub_button)
{
JsonData tmpJson = new JsonData();
tmpJson["type"] = item.type;
tmpJson["name"] = item.name;
if (!string.IsNullOrEmpty(item.key))
{
tmpJson["key"] = item.key;
}
else
{
tmpJson["url"] = item.url;
}
json["sub_button"].Add(tmpJson);
}
jd["button"].Add(json);
}
else
{
JsonData tmpJson = new JsonData();
tmpJson["type"] = menu.type;
tmpJson["name"] = menu.name;
if (!string.IsNullOrEmpty(menu.key))
{
tmpJson["key"] = menu.key;
}
else
{
tmpJson["url"] = menu.url;
}
jd["button"].Add(tmpJson);
}
}
return jd.ToJson();
}

调用方法如下:

IListlist = new List();

Menu m1 = new Menu();
m1.type = "click";
m1.name = "今日歌曲";
m1.key = "V1001_TODAY_MUSIC"; Menu m2 = new Menu();
m2.type = "click";
m2.name = "歌手简介";
m2.key = "V1001_TODAY_SINGER"; list.Add(m1);
list.Add(m2); Menu m3 = new Menu();
m3.name = "菜单";
m3.IsSub = true; Menu m4 = new Menu();
m4.type = "view";
m4.name = "搜索";
m4.url = "http://www.soso.com/"; Menu m5 = new Menu();
m5.type = "view";
m5.name = "视频";
m5.url = "http://v.qq.com"; Menu m6 = new Menu();
m6.type = "click";
m6.name = "赞我们一下";
m6.key = "V1001_GOOD"; m3.sub_button.Add(m4);
m3.sub_button.Add(m5);
m3.sub_button.Add(m6); string json = CreateMenuJson(list);

正常情况下应该是从数据库读取,不用这样一个个的去实例化。这样就可以快速的得到自定义菜单的json数据。

附:LitJson下载地址

asp.net 输出微信自定义菜单json的更多相关文章

  1. Magcodes.WeiChat——自定义CustomCreationConverter之实现微信自定义菜单的序列化

    微信自定义菜单接口是一个比较麻烦的接口,往往开发的小伙伴们看到下面的这段返回JSON,整个人就会不好了:   {"menu":{"button":[{" ...

  2. 微信自定义菜单说php json_encode不转义中文汉字的方法

    http://blog.csdn.net/qmhball/article/details/45690017 最近在开发微信自定义菜单. 接口比较简单,就是按微信要求的格式post一段json数据过去就 ...

  3. java 微信自定义菜单 java微信接口开发 公众平台 SSM redis shiro 多数据源

    A 调用摄像头拍照,自定义裁剪编辑头像,头像图片色度调节B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,快速开发利器)+快速表单构建器 freemaker模版技术 ,0个代码不用写,生成 ...

  4. java SSM 框架 微信自定义菜单 快递接口 SpringMVC mybatis redis shiro ehcache websocket

    A 调用摄像头拍照,自定义裁剪编辑头像,头像图片色度调节B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,快速开发利器)+快速表单构建器 freemaker模版技术 ,0个代码不用写,生成 ...

  5. Magicodes.WeiChat——自定义knockoutjs template、component实现微信自定义菜单

    本人一向比较喜欢折腾,玩了这么久的knockoutjs,总觉得不够劲,于是又开始准备折腾自己了. 最近在完善Magicodes.WeiChat微信开发框架时,发现之前做的自定义菜单这块太不给力了,而各 ...

  6. 微信自定义菜单url默认80端口问题解决

    微信自定义菜单url默认80端口的,但是有些服务器上可能配置了多个tomcat.或者是刚好你服务器上80端口被占用了.在这样的情况下,我们可以通过如下方式解决: 首先安装apache,关于apache ...

  7. 我的第一个npm包:wechat-menu-editor 基于Vue的微信自定义菜单编辑器

    wechat-menu-editor 微信自定义菜单编辑器 前言 在做微信公众号相关开发时,基本上会去开发的功能就是微信自定义菜单设置的功能,本着不重复造轮子的原则,于是基于Vue封装的一个微信自定义 ...

  8. C#/ASP.NET MVC微信公众号接口开发之从零开发(四) 微信自定义菜单(附源码)

    C#/ASP.NET MVC微信接口开发文章目录: 1.C#/ASP.NET MVC微信公众号接口开发之从零开发(一) 接入微信公众平台 2.C#/ASP.NET MVC微信公众号接口开发之从零开发( ...

  9. 微信自定义菜单errcode(40016)

    最近在做微信开发,通过微信API创建自定义菜单时候出现:{"errcode":40016,"errmsg":"invalid button size ...

随机推荐

  1. Linux命令之usermod

    usermod [选项] 登录名 usermod修改用户基本信息. (1).常用选项 -d,--home HOME_DIR 用户的新主目录 -g,--gid GROUP 强制GROUP为新主组 -G, ...

  2. PHP设置会话(Session)超时过期时间实现登录时间限制[转]

    用户登录系统60分钟后如果没有操作就自动退出 第一种方法即设置php.ini配置文件,设置session.gc_maxlifetime和session.cookie_lifetime节点属性值,当然也 ...

  3. 【SDOI2017】树点染色【线段树+LCT】

    本来只是想练练LCT,没想到是个线段树 对于操作1:诶新的颜色?这不是access吗? 也就是说,我们用一棵splay来表示一种颜色 操作2直接在LCT上乱搞-- 不对啊,操作3要查子树 诶好像是静态 ...

  4. Java并发(十六):并发工具类——Exchanger

    Exchanger(交换者)是一个用于线程间协作的工具类.Exchanger用于进行线程间的数据交换.它提供一个同步点,在这个同步点两个线程可以交换彼此的数据.这两个线程通过exchange方法交换数 ...

  5. POJ 2774 Long Long Message 后缀数组模板题

    题意 给定字符串A.B,求其最长公共子串 后缀数组模板题,求出height数组,判断sa[i]与sa[i-1]是否分属字符串A.B,统计答案即可. #include <cstdio> #i ...

  6. ACM -- 算法小结(十)素数的两种打表法

    素数的两种打表法 下面介绍两种素数打表法,由于是两年前留下的笔记,所以没有原创链接~~ @_@!! 第一种疯狂打表法: #include<stdio.h> #include<math ...

  7. CROC 2016 - Elimination Round (Rated Unofficial Edition) A. Amity Assessment 水题

    A. Amity Assessment 题目连接: http://www.codeforces.com/contest/655/problem/A Description Bessie the cow ...

  8. 蓝屏代码详解(更新WIN7蓝屏代码)

    6位代码含意 0 0x0000 作业完成.  1 0x0001 不正确的函数.  2 0x0002 系统找不到指定的档案.  3 0x0003 系统找不到指定的路径.  4 0x0004 系统无法开启 ...

  9. 使用OData快速构建REST服务

    OData是微软支持的一种查询标准,它的第四版使用了REST规范,看起来简洁多了.它的最大的特点是可以在客户端自行配制查询条件,使用它构建REST服务时再也不用担心查询的扩展性问题了. 如下是几个简单 ...

  10. sql 锁类型与锁机制 转

      SQL Server锁类型(SQL)收藏1. HOLDLOCK: 在该表上保持共享锁,直到整个事务结束,而不是在语句执行完立即释放所添加的锁.   2. NOLOCK:不添加共享锁和排它锁,当这个 ...