这里使用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. Bzoj1202/洛谷P2294 [HNOI2005]狡猾的商人(带权并查集/差分约束系统)

    题面 Bzoj 洛谷 题解 考虑带权并查集,设\(f[i]\)表示\(i\)的父亲(\(\forall f[i]<i\)),\(sum[i]\)表示\(\sum\limits_{j=fa[i]} ...

  2. FastReport.Net使用:[13]如何使用表达式

    在FastReport报表中,表达式(Expressions)用在很多地方,譬如文本框,排序过滤器等. 表达式基于报表选择的脚本语言,从菜单[报表]->[选项]打开“报表选项对话框”,切换到“脚 ...

  3. 「LOJ6482」LJJ爱数数

    「LOJ6482」LJJ爱数数 解题思路 : 打表发现两个数 \(a, b\) 合法的充要条件是(我不管,我就是打表过的): \[ a + b = \text{gcd}(a, b)^2 \] 设 \( ...

  4. [BZOJ4338][BJOI2015]糖果(扩展Lucas)

    先求出式子$P_{C_{K+m-1}^{m}}^{n}$,然后对于排列直接$O(n)$求解,对于组合用扩展Lucas求解. 但这题数据并没有保证任何一个模数的质因子的$p^k$在可线性处理的范围内,于 ...

  5. Stirling数,Bell数,Catalan数,Bernoulli数

    组合数学的实质还是DP,但是从通式角度处理的话有利于FFT等的实现. 首先推荐$Candy?$的球划分问题集合: http://www.cnblogs.com/candy99/p/6400735.ht ...

  6. JNI介绍

    JNI是在学习Android HAL时必须要面临一个知识点,如果你不了解它的机制,不了解它的使用方式,你会被本地代码绕的晕头转向,JNI作为一个中间语言的翻译官在运行Java代码的Android中有着 ...

  7. hdu 4240 最大流量路径

    题意弄了半天: 给出一个有向图,带边权,src,dst. 求出src到dst的最大流,再求出从src到dst流量最大的路径的流量,求它们的比值. #include <cstdio> #in ...

  8. bzoj 4836: [Lydsy2017年4月月赛]二元运算 -- 分治+FFT

    4836: [Lydsy2017年4月月赛]二元运算 Time Limit: 8 Sec  Memory Limit: 128 MB Description 定义二元运算 opt 满足   现在给定一 ...

  9. Android 杀掉当前程序的进程

    在销毁所有活动的代码后面再加上杀掉当前进程的代码,以保证程序完全退出,杀掉进程的代码如下所示: android.os.Process.killProcess(android.os.Process.my ...

  10. Codeforces Round #346 (Div. 2) B. Qualifying Contest 水题

    B. Qualifying Contest 题目连接: http://www.codeforces.com/contest/659/problem/B Description Very soon Be ...