一、什么是JSON?
JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度。
JSON就是一串字符串 只不过元素会使用特定的符号标注。
{} 双括号表示对象
[] 中括号表示数组
"" 双引号内是属性或值
: 冒号表示后者是前者的值(这个值可以是字符串、数字、也可以是另一个数组或对象)
所以 {"name": "Michael"} 可以理解为是一个包含name为Michael的对象
而[{"name": "Michael"},{"name": "Jerry"}]就表示包含两个对象的数组
当然了,你也可以使用{"name":["Michael","Jerry"]}来简化上面一部,这是一个拥有一个name数组的对象
二、JSON解析之传统的JSON解析
1、生成json字符串
public static String createJsonString(String key, Object value) { JSONObject jsonObject = new JSONObject(); jsonObject.put(key, value); return jsonObject.toString(); }
一、JSONObject和JSONArray的数据表示形式
JSONObject的数据是用 { } 来表示的,
例如: { "id" : "123", "courseID" : "huangt-test", "title" : "提交作业", "content" : null }
而JSONArray,顾名思义是由JSONObject构成的数组,用 [ { } , { } , ...... , { } ] 来表示
例如: [ { "id" : "123", "courseID" : "huangt-test", "title" : "提交作业" } , { "content" : null, "beginTime" : 1398873600000 "endTime" } ] ;
表示了包含2个JSONObject的JSONArray。
可以看到一个很明显的区别,一个用的是 { } ,一个最外面用的是 [ ] ;
二、如何从字符串String获得JSONObject对象和JSONArray对象
JSONObject jsonObject = new JSONObject (String str);
JSONArray jsonArray = new JSONArray(String str ) ;
三、如何从JSONArray中获得JSONObject对象
大家可以把JSONArray当成一般的数组来对待,只是获取的数据内数据的方法不一样
JSONObject jsonObject = (JSONObject)jsonArray.get(i);
JSONObject jsonObject = jsonArray.getJSONObject(i) ;
两者都可。第一种注意转换
四、获取JSON内的数据
int jid= jsonObject.getInt ( "id" ) ; // 这里的jid得到的数据就是123.
String jcourse=jsonObject.getString( " courseID") ; // 这里的jcourse得到的数据就是huangt-test.
Strirng jcourse = jsonObject.get("courseID").toString();
五、一般地为键值对
eg:{ name:"xm", value:"张三"}
String jname = null;
if(jsonObject.get("name").equals("xm")){
jname=jsonObject.get("value").toString();
}
六: JSON.parse( str ) --> 把字符串转为JSON对象
JSON.stringify( obj ) -->把对象解析为字符串
JSONObject、JSONArray区别
json,就是一个键对应一个值,超级简单的一对一关系。现在用到的json那可以层层嵌套啊,刚开始接触的时候,确实有种崩溃的赶脚,不想去理,取个数据还那么麻烦。其实,就跟if else语句一样,如果if中套if,if中再套if,写的规范了还行,要是代码格式不规范,那我们肯定也看着麻烦。所以啊,对于json嵌套,只要记住符号“:”前是键,符号后是值大括号成对找,一层层剥开,就清楚了。 举个例子说明,如下:
[{name1:{name2:{name3:'value1',name4:'value2'}}},{}]
从外到里看,例子中就是一个数组,数组里面是两个json格式的字符串。这样分析思路就清晰多了。
工作中需要取出name4的值,你们会怎么取呢?。最初我都想过字符串截取,那时还不了解JSONArray,现在知道了,取出来也就相当容易了。
取出name4值过程步骤:1,将以上字符串转换为JSONArray对象;2,取出对象的第一项,JSONObject对象;3,取出name1的值JSONObject对象;4,取出name2的值JSONObject对象;5,取出name4的值value2。
示例中json数组格式的字符串可以通过方法直接转换为JSONArray的格式:
JSONArray.fromObject(String)
- JSONArray getJsonArray=JSONArray.fromObject(arrayStr);//将结果转换成JSONArray对象的形式
- JSONObject getJsonObj = getJsonArray.getJSONObject(0);//获取json数组中的第一项
- String result=getJsonObj.getJSONObject("name1").getJSONObject("name2").getJSONObject("name4");
好了我们说说这两个对象。
1,JSONObject
json对象,就是一个键对应一个值,使用的是大括号{ },如:{key:value}
2,JSONArray
json数组,使用中括号[ ],只不过数组里面的项也是json键值对格式的
Json对象中添加的是键值对,JSONArray中添加的是Json对象
- JSONObject Json = new JSONObject();
- JSONArray JsonArray = new JSONArray();
-
- Json.put("key", "value");//JSONObject对象中添加键值对
- JsonArray.add(Json);//将JSONObject对象添加到Json数组中
3,JSONObject与Map
Map map和json都是键值对,不同的是map中键值对中间用等号分开,json中键值对中间用冒号分开。其实json就是一种特殊形式的map。
- Map<String,String> strmap=new JSONObject();
这里的需求是:request对象获取的map,想要返回json格式也不用白费力了。
@{
ViewBag.Title = "Index2";
}
json文件:
{
"total":25,
"rows":[
{
"id":1,
"Name":"xiaoming1",
"Mobile":"222",
"Note":"diyihang"
},
{
"id":2,
"Name":"xiaoming2",
"Mobile":"3333",
"Note":"dier"
},
{
"id":3,
"Name":"xiaoming2",
"Mobile":"34444",
"Note":"didssssss"
}
,
{
"id":4,
"Name":"xiaoming4",
"Mobile":"6555544",
"Note":"did5555ss"
}
]
}
<script src="~/Content/bootstrap/jquery-3.4.1.min.js"></script>
<link rel="stylesheet" href="~/Content/bootstrap/css/bootstrap.min.css">
<script src="~/Content/bootstrap/js/bootstrap.min.js"></script>
<link rel="stylesheet" href="~/Content/bootstraptable/bootstrap-table.css">
<script src="~/Content/bootstraptable/bootstrap-table.js"></script>
<script src="~/Content/bootstraptable/extensions/editable/bootstrap-table-editable.js"></script>
<--汉化文件 -->
<script src="~/Content/bootstraptable/locale/bootstrap-table-zh-CN.js"></script>
<--table-->
<table id="table2"></table>
<--grid-->
<table id="grid"></table>
<--list-->
<table id="_list"></table>
<script type="text/javascript" >
$('#table2').bootstrapTable({
url: '/data1.json',
columns: [{
field: 'id',
title: '序号'
}, {
field: 'name',
title: '名称'
}, {
field: 'price',
title: '价格'
}, ]
});
//
var $table;
//初始化bootstrap-table的内容
// function InitMainTable() {
//记录页面bootstrap-table全局变量$table,方便应用
// var queryUrl = '/TestUser/FindWithPager?rnd=' + Math.random()
var queryUrl = '/data3.json';
// $table =
$('#grid').bootstrapTable({
url: queryUrl, //请求后台的URL(*)
method: 'GET', //请求方式(*)
//toolbar: '#toolbar', //工具按钮用哪个容器
striped: true, //是否显示行间隔色
cache: false, //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
pagination: false, //是否显示分页(*)
sortable: true, //是否启用排序
sortOrder: "asc", //排序方式
sidePagination: "server", //分页方式:client客户端分页,server服务端分页(*)
pageNumber: 1, //初始化加载第一页,默认第一页,并记录
//rows
pageSize: 2, //每页的记录行数(*)
pageList: [10, 25, 50, 100], //可供选择的每页的行数(*)
search: false, //是否显示表格搜索
strictSearch: true,
showColumns: true, //是否显示所有的列(选择显示的列)
showRefresh: true, //是否显示刷新按钮
minimumCountColumns: 2, //最少允许的列数
clickToSelect: true, //是否启用点击选中行
//height: 500, //行高,如果没有设置height属性,表格自动根据记录条数觉得表格高度
uniqueId: "ID", //每一行的唯一标识,一般为主键列
showToggle: true, //是否显示详细视图和列表视图的切换按钮
cardView: false, //是否显示详细视图
detailView: false, //是否显示父子表
//得到查询的参数
queryParams: function (params) {
//这里的键的名字和控制器的变量名必须一致,这边改动,控制器也需要改成一样的
var temp = {
rows: params.limit, //页面大小
page: (params.offset / params.limit) + 1, //页码
sort: params.sort, //排序列名
sortOrder: params.order //排位命令(desc,asc)
};
return temp;
},
columns: [
{
checkbox: true,
visible: true //是否显示复选框
},
{
field: 'Name',
title: '姓名',
sortable: true
}, {
field: 'Mobile',
title: '手机',
sortable: true
},
{
field: 'Note',
title: '备注'
},
{
field: 'id',
title: '操作',
width: 120,
align: 'center',
valign: 'middle',
formatter: actionFormatter
}, ],
onLoadSuccess: function () {
},
onLoadError: function () {
showTips("数据加载失败!");
},
onDblClickRow: function (row, $element) {
var id = row.ID;
EditViewById(id, 'view');
},
});
// };
//
function actionFormatter(value, row, index) {
var id = value;
var result = "";
result += "<a href='javascript:;' class='btn btn-xs green' onclick=\"EditViewById('" + id + "', view='view')\" title='查看'><span class='glyphicon glyphicon-search'></span></a>";
result += "<a href='javascript:;' class='btn btn-xs blue' onclick=\"EditViewById('" + id + "')\" title='编辑'><span class='glyphicon glyphicon-pencil'></span></a>";
result += "<a href='javascript:;' class='btn btn-xs red' onclick=\"DeleteByIds('" + id + "')\" title='删除'><span class='glyphicon glyphicon-remove'></span></a>";
return result;
}
/*
queryParams : function (params) {
//这里的键的名字和控制器的变量名必须一直,这边改动,控制器也需要改成一样的
var temp = $("#ffSearch").serializeJsonObject();
temp["rows"] = params.limit; //页面大小
temp["page"] = (params.offset / params.limit) + 1; //页码
temp["sort"] = params.sort; //排序列名
temp["sortOrder"] = params.order; //排位命令(desc,asc)
//特殊格式的条件处理
temp["WHC_Age"] = $("#WHC_Age").val() + "~" + $("#WHC_Age2").val();
temp["WHC_BirthDate"] = $("#WHC_BirthDate").val() + "~" + $("#WHC_BirthDate2").val();
return temp;
},
//连接字段格式化
function linkFormatter(value, row, index) {
return "<a href='" + value + "' title='单击打开连接' target='_blank'>" + value + "</a>";
}
//Email字段格式化
function emailFormatter(value, row, index) {
return "<a href='mailto:" + value + "' title='单击打开连接'>" + value + "</a>";
}
//性别字段格式化
function sexFormatter(value) {
if (value == "女") { color = 'Red'; }
else if (value == "男") { color = 'Green'; }
else { color = 'Yellow'; }
return '<div style="color: ' + color + '">' + value + '</div>';
}
*/
window.onload = dosearch();
///加载抽检列表
function dosearch() {
//先销毁表格
$("#_list").bootstrapTable('destroy');
//初始化表格,动态从服务器加载数据
$("#_list").bootstrapTable({
method: "get", //使用get请求到服务器获取数据
contentType: "application/x-www-form-urlencoded",//一种编码。好像在post请求的时候需要用到。这里用的get请求,注释掉这句话也能拿到数据
// url: "ReportControl.ashx", //获取数据的Servlet地址
url: "/data3.json",
dataType: "json",
dataField: "rows",//这是返回的json数组的key.默认好像是"rows".这里只有前后端约定好就行
//height: tableHeight(),//高度调整
//striped: true, //表格显示条纹
pagination: false, //启动分页
pageNumber: 1, //当前第几页
pageSize: 300, //每页显示的记录数
pageList: [5, 10, 20, 30],//分页步进值
clickToSelect: true,//是否启用点击选中行
locale: 'zh-CN',//中文支持,
paginationPreText: '<',//指定分页条中上一页按钮的图标或文字,这里是<
paginationNextText: '>',//指定分页条中下一页按钮的图标或文字,这里是>
search: false, //是否启用查询
showColumns: false, //显示下拉框勾选要显示的列
showRefresh: false, //显示刷新按钮
sidePagination: "server", //表示服务端请求
//设置为undefined可以获取pageNumber,pageSize,searchText,sortName,sortOrder
//设置为limit可以获取limit, offset, search, sort, order
queryParamsType: '',//查询参数组织方式
idField: "ID",//指定主键列
queryParams: function (params) {//自定义参数,这里的参数是传给后台的,我这是是分页用的
return {//这里的params是table提供的
pagesize: params.pageSize, //每页多少条数据
pageindex: params.pageNumber, //请求第几页
/*
budgetyear: escape($("#inBudgetYear").val()),
budgetmonth1: escape($("#inBudgetMonth1").val()),
budgetmonth2: escape($("#inBudgetMonth2").val()),
budgetcompany: escape($("#inBudgetCompany").val()),
departid: escape($("#h_newDepart").val()),
execdepart: $('#inResult1').is(':checked'),
companyin: $('#inResult2').is(':checked')
*/
};
},
//请求服务器时所传的参数
onLoadSuccess: function () { //加载成功时执行
// layer.msg("加载成功");
mergeTable("Name");
},
onLoadError: function () { //加载失败时执行
// layer.msg("加载数据失败", { time: 1500, icon: 2 });
},
columns: [
{
checkbox: true
}, {
title: '序号',//标题 可不加
formatter: function (value, row, index) {
return index + 1;
}
}, {
field: "id",
title: "ID",
visible: false, //是否显示
}, {
field: "Name",
title: "名称",
}, {
field: "Mobile",
title: "手机"
}, {
field: "Note",
title: "备注"
}
]
});
}
/*
//可以加多个
$('#table').bootstrapTable('mergeCells', {
index : 0,
field : "pairs_all",
rowspan : data.length
});
*/
function mergeTable(field) {
$table = $("#_list");
var obj = getObjFromTable($table, field);
for (var item in obj) {
$('#_list').bootstrapTable('mergeCells', {
index: obj[item].index,
field: field,
colspan: 1,
rowspan: obj[item].row
});
}
}
function getObjFromTable($table, field) {
var obj = [];
var maxV = $table.find("th").length;
var columnIndex = 0;
var filedVar;
for (columnIndex = 0; columnIndex < maxV; columnIndex++) {
filedVar = $table.find("th").eq(columnIndex).attr("data-field");
if (filedVar == field) break;
}
var $trs = $table.find("tbody > tr");
var $tr;
var index = 0;
var content = "";
var row = 1;
for (var i = 0; i < $trs.length; i++) {
$tr = $trs.eq(i);
var contentItem = $tr.find("td").eq(columnIndex).html();
//exist
if (contentItem.length > 0 && content == contentItem) {
row++;
} else {
//save
if (row > 1) {
obj.push({ "index": index, "row": row });
}
index = i;
content = contentItem;
row = 1;
}
}
if (row > 1) obj.push({ "index": index, "row": row });
return obj;
}
</script>
在Meta库中Meta库.AA_Customerbutton中,一行数据代表一个按钮
INSERT INTO [UFMeta_1657].[dbo].[AA_CustomerButton]
([cButtonID]
,[cButtonKey]
,[cButtonType]
,[cProjectNO]
,[cFormKey]
,[cVoucherKey]
,[cKeyBefore]
,[iOrder]
,[cGroup]
,[cCustomerObjectName]
,[cCaption]
,[cLocaleID]
,[cImage]
,[cToolTip]
,[cHotKey]
,[bInneralCommand]
,[cVariant]
,[cVisibleAsKey]
,[cEnableAsKey])
VALUES
(<cButtonID, uniqueidentifier,>
,<cButtonKey, nvarchar(50),>
,<cButtonType, nvarchar(50),>
,<cProjectNO, nvarchar(50),>
,<cFormKey, nvarchar(50),>
,<cVoucherKey, nvarchar(50),>
,<cKeyBefore, nvarchar(50),>
,<iOrder, nvarchar(50),>
,<cGroup, nvarchar(50),>
,<cCustomerObjectName, nvarchar(100),>
,<cCaption, nvarchar(100),>
,<cLocaleID, nvarchar(50),>
,<cImage, nvarchar(100),>
,<cToolTip, nvarchar(200),>
,<cHotKey, nvarchar(50),>
,<bInneralCommand, int,>
,<cVariant, nvarchar(400),>
,<cVisibleAsKey, nvarchar(100),>
,<cEnableAsKey, nvarchar(100),>)
GO
cButtonID cButtonKey cButtonType cProjectNO cFormKey cVoucherKey
cKeyBefore iOrder cGroup cCustomerObjectName cCaption cLocaleID cImage
cToolTip cHotKey bInneralCommand cVariant cVisibleAsKey cEnableAsKey
45814D73 DAction_C default U8Custdef NULL 88
Refresh 0 IEDIT UFIDA.U8.UAP.Plugin.AddButton.clsbdpo 采购合同 zh-cn print
current 生成采购合同 Ctrl+N 1 CustomPrintA modify Refresh
******************************************************8
UFIDA.U8.UAP.Plugin.AddButton.clsdpo为dll程序集
需要注册
注册方法
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\regasm.exe /tlb c:\U8SOFT\UAP\Runtime\CustomAction.dll
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\regasm.exe c:\U8SOFT\UAP\Runtime
\UFIDA.U8.UAP.Plugin.AddButton.dll
在命令行执行或者存入*.bat文件
新建一个VB类,并写入以下方法即可 ‘执行按钮,objVoucher为单据或列表对象&
varentValue为在表中预置的cVariant的值