java版json解释器及相关代码生成
2013-12-19 10:17
459 查看
最近转做前端,但是遇到一个问题就是:
要根据后台得到的json数据进行前端js编程。。。我发现抓取一个json包,然后对着它的格式参数属性来一个一个书写js代码是非常非常痛苦懊恼追悔莫及的。请原谅我用这么多形容词。所以就用业余的匆匆一瞥的时间---时间真的不够,做出了一个草稿形式的app--当然是swing,因为是跨平台---重要的是公司使用的系统除了windows也有linux。
这个程序充满了bug,因为是用Intellij做的,第一次用它来做是swing程序,而且工期太紧了,一天时间做出来,以后可能会翻工。
打包了以后就是这样的:
点击run。bat然后输入下面这个json就可以看到结果了:
恩,太仓促了,竟然连连树形图片都找不到。。下次要修正。点击生成js代码:
又一个bug。。。。js格式的不是这样的。好吧,有时间慢慢修正。
下面就将核心部分代码贴出来,顺便给出下载的链接。
假如想试用的话,就到下面地址,
要根据后台得到的json数据进行前端js编程。。。我发现抓取一个json包,然后对着它的格式参数属性来一个一个书写js代码是非常非常痛苦懊恼追悔莫及的。请原谅我用这么多形容词。所以就用业余的匆匆一瞥的时间---时间真的不够,做出了一个草稿形式的app--当然是swing,因为是跨平台---重要的是公司使用的系统除了windows也有linux。
这个程序充满了bug,因为是用Intellij做的,第一次用它来做是swing程序,而且工期太紧了,一天时间做出来,以后可能会翻工。
打包了以后就是这样的:
点击run。bat然后输入下面这个json就可以看到结果了:
{ "employees": [ { "firstName":"Bill" , "lastName":"Gates" }, { "firstName":"George" , "lastName":"Bush" }, { "firstName":"Thomas" , "lastName":"Carter" } ] }
恩,太仓促了,竟然连连树形图片都找不到。。下次要修正。点击生成js代码:
又一个bug。。。。js格式的不是这样的。好吧,有时间慢慢修正。
下面就将核心部分代码贴出来,顺便给出下载的链接。
package EasisTools.UI; import Easis.Client.AppConfig; import Easis.Common.StringUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import javax.swing.*; import javax.swing.tree.DefaultTreeCellEditor; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.TreeSelectionModel; /** * Created with IntelliJ IDEA. * User: Administrator * Date: 13-12-21 * Time: 下午1:43 * To change this template use File | Settings | File Templates. */ import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.FlowLayout; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.List; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.border.TitledBorder; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeCellRenderer; public class JsonStructTree extends JPanel { /** * 数据源 * **/ private JTree _dbTree; private DefaultMutableTreeNode _tableTreeNode; private DefaultMutableTreeNode _viewTreeNode; private DefaultMutableTreeNode _procTreeNode; private DefaultMutableTreeNode _treeRoot; private DefaultTreeModel _treeModel; private AppConfig appConfig=new AppConfig(); public void setHandler(TreeClickHandler handler){ _handler=handler; } private JSONObject _jsonObj=null; private JSONArray _jsonArr=null; private TreeClickHandler _handler; public JsonStructTree(JSONObject jsonObject,JSONArray jsonArray) { _jsonObj=jsonObject; _jsonArr=jsonArray; setBackground(Color.WHITE); setBorder(new TitledBorder(null, "json树形信息", TitledBorder.LEADING, TitledBorder.TOP, null, null)); setLayout(new BorderLayout(0, 0)); JScrollPane scrollPane_1 = new JScrollPane(); add(scrollPane_1, BorderLayout.CENTER); JTree dbDetailTree = new JTree(); _dbTree=dbDetailTree; scrollPane_1.setViewportView(dbDetailTree); _initTreeList(); } /** * 初始化树形结构 * */ private void _initTreeList(){ if(_jsonArr==null&&_jsonObj==null){ return; } treeItemInfo _t_tableInfo= new treeItemInfo(); treeItemInfo _t_viewInfo=new treeItemInfo(); treeItemInfo _t_procInfo=new treeItemInfo(); _t_tableInfo.icon="table3.png"; _t_tableInfo.itemType=""; _t_tableInfo.name="数据表"; _t_viewInfo.icon="view_icon.png"; _t_viewInfo.itemType=""; _t_viewInfo.name="视图"; _t_procInfo.icon="database_active.png"; _t_procInfo.itemType=""; _t_procInfo.name="存储过程"; _treeRoot=new DefaultMutableTreeNode(); treeItemInfo t1=new treeItemInfo(); t1.icon="sitemap.png"; t1.name="详细信息"; t1.itemType=""; treeItemInfo rootItem=new treeItemInfo(); if(_jsonObj!=null){ rootItem.icon="jsonArrayIcon.png"; rootItem.itemType="jsonObject"; rootItem.name="json对象"; } else if(_jsonArr!=null){ rootItem.name="json数组"; rootItem.itemType="jsonArray"; rootItem.icon="table163.png"; } _treeRoot.setUserObject(rootItem); //--读取下面的json数据,最多三层。 //--第一层 if(_jsonObj!=null){ recursion_setTreeNode(_jsonObj,_treeRoot,0); } else if(_jsonArr!=null){ recursion_setTreeNode(_jsonArr,_treeRoot,0); } //_dbTree=new JTree(new DefaultMutableTreeNode[]{_tableTreeNode,_viewTreeNode,_procTreeNode}); _treeModel=new DefaultTreeModel(_treeRoot); _dbTree.setModel(_treeModel); _dbTree.setRootVisible(false); //_dbTree.setPreferredSize(new Dimension(150, 25)); _dbTree.setCellRenderer(new dbDetailCell()); _dbTree.addMouseListener(new MouseListener() { @Override public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub if(e.getClickCount()>=2){ DefaultMutableTreeNode treeNode=(DefaultMutableTreeNode) _dbTree.getLastSelectedPathComponent(); treeItemInfo myitemInfo= (treeItemInfo) treeNode.getUserObject(); if(_handler!=null){ _handler.handler(myitemInfo); } else{ System.out.println(myitemInfo.name); } } } }); } private int maxLevel=5; private void recursion_setTreeNode(Object parentObject,DefaultMutableTreeNode parentNode,int parentLevel){ if(parentLevel>maxLevel){ return; } if(parentObject==null){ return; } if(parentObject instanceof JSONObject){ JSONObject _obj=(JSONObject) parentObject; for(String keyName: _obj.keySet()){ treeItemInfo _tItem=new treeItemInfo(); Object cObj=_obj.get(keyName); if(cObj instanceof JSONObject){ _tItem.icon="jsonArrayIcon.png"; _tItem.name=keyName; _tItem.itemType="jsonObject"; DefaultMutableTreeNode _node=new DefaultMutableTreeNode(); _node.setUserObject(_tItem); parentNode.add(_node); recursion_setTreeNode(_obj.getJSONObject(keyName),_node,parentLevel+1); continue; } else if(cObj instanceof JSONArray){ JSONArray _cArr=_obj.getJSONArray(keyName) ; _tItem.icon="table163.png"; _tItem.name=keyName; _tItem.itemType="jsonArray"; DefaultMutableTreeNode _node=new DefaultMutableTreeNode(); _node.setUserObject(_tItem); parentNode.add(_node); recursion_setTreeNode(_obj.getJSONArray(keyName),_node,parentLevel+1); return; } else{ _tItem.icon="function_logo.png"; _tItem.name=keyName+"="+StringUtil.cutStr(_obj.getString(keyName),6,"..."); _tItem.itemType="jsonAttribute"; DefaultMutableTreeNode _node=new DefaultMutableTreeNode(); _node.setUserObject(_tItem); parentNode.add(_node); continue; } } } else if(parentObject instanceof JSONArray){ JSONArray j_arr=(JSONArray) parentObject; for(int cindex=0;cindex<j_arr.size();cindex++){ treeItemInfo _tItem=new treeItemInfo(); Object objRes=j_arr.get(cindex); _tItem.name="["+cindex+"]"; if(objRes instanceof JSONObject){ _tItem.icon="jsonArrayIcon.png"; _tItem.itemType="jsonObject"; DefaultMutableTreeNode _node=new DefaultMutableTreeNode(); _node.setUserObject(_tItem); parentNode.add(_node); recursion_setTreeNode(objRes,_node,parentLevel+1); continue; } else if(objRes instanceof JSONArray){ _tItem.icon="table163.png"; _tItem.itemType="jsonArray"; DefaultMutableTreeNode _node=new DefaultMutableTreeNode(); _node.setUserObject(_tItem); parentNode.add(_node); recursion_setTreeNode(objRes,_node,parentLevel+1); return; } else{ _tItem.icon="function_logo.png"; _tItem.name+=""+StringUtil.cutStr(objRes.toString(),6,"..."); _tItem.itemType="jsonAttribute"; DefaultMutableTreeNode _node=new DefaultMutableTreeNode(); _node.setUserObject(_tItem); parentNode.add(_node); continue; } } } } /** * 根据某个记录ID绑定树形 * */ public void _BindTreeList(int theID){ _tableTreeNode.removeAllChildren(); _viewTreeNode.removeAllChildren(); _procTreeNode.removeAllChildren(); _dbTree.setModel(_treeModel); _dbTree.updateUI(); } /** * 针对树形的数据模型 * */ public class treeItemInfo{ public String name; public String itemType; public String icon; public String toString(){ return this.name; } } /** * 自定义tree的显示方式 * **/ class dbDetailCell implements TreeCellRenderer{ @Override public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { // TODO Auto-generated method stub //DynamicUtilTreeNode dUtilTreeNode=(DynamicUtilTreeNode)value; DefaultMutableTreeNode treeNode=(DefaultMutableTreeNode)value; Object object=treeNode.getUserObject(); //setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); JPanel cPanel=new JPanel(); cPanel.setLayout(new FlowLayout(FlowLayout.LEFT,0,0)); if(leaf==false){ ImageIcon cOpened; if(expanded==true){ cOpened=appConfig.getResourceIcon("arrow_state_blue_expanded.png", 16 , 16); cPanel.add(new JLabel(cOpened)); } else{ cOpened=appConfig.getResourceIcon("arrow_state_blue_right.png", 16 , 16); cPanel.add(new JLabel(cOpened)); } } else{ /* JLabel lb1=new JLabel(); lb1.setPreferredSize(new Dimension(16, 16)); cPanel.add(lb1); */ } if(object instanceof treeItemInfo){ treeItemInfo tItemInfo=(treeItemInfo)object; ImageIcon icon= appConfig.getResourceIcon(tItemInfo.icon, 20, 20); JLabel l1=new JLabel(icon); l1.setText(tItemInfo.name); cPanel.add(l1); } else{ ImageIcon icon=appConfig.getResourceIcon("stock_unknown.png",20,20); JLabel l1=new JLabel(icon); l1.setText(value.toString()); cPanel.add(l1); } if (selected) { // cPanel.setBackground(Utils.str2color("#90e3f2")); //setBackground(Utils.str2color("#90e3f2")); // setBorder(new ) //setForeground(Color.red); //setBackground(tree.getse); //setForeground(tree.getSelectionForeground()); } else { cPanel.setBackground(tree.getBackground()); cPanel.setForeground(tree.getForeground()); //setBackground(tree.getBackground()); //setForeground(tree.getForeground()); } cPanel.setEnabled(tree.isEnabled()); cPanel.setFont(tree.getFont()); cPanel.setOpaque(true); // cPanel.setPreferredSize(new Dimension(150, 40)); return cPanel; }} public interface TreeClickHandler{ public void handler(treeItemInfo itemInfo); } }
package EasisTool.Main; import Easis.Common.StringUtil; import EasisTools.UI.JsonStructTree; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class JSONViewer extends JDialog { private JPanel contentPane; private JButton buttonOK; private JButton buttonCancel; private JTextArea txt_json; private JComboBox cbox_tplType; private JButton btn_GenCode; private JScrollPane scroll_tree; private JTextArea txt_result; public JSONViewer() { setContentPane(contentPane); setModal(true); getRootPane().setDefaultButton(buttonOK); init(); buttonOK.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { onOK(); } }); buttonCancel.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { onCancel(); } }); // call onCancel() when cross is clicked setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { onCancel(); } }); // call onCancel() on ESCAPE contentPane.registerKeyboardAction(new ActionListener() { public void actionPerformed(ActionEvent e) { onCancel(); } }, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); } JSONObject jsonObject=null; JSONArray jsonArray=null; private void onOK() { // add your code here boolean isArray=false; jsonObject=null; jsonArray=null; try{ jsonObject= JSON.parseObject(txt_json.getText()); } catch (Exception ed){ } try{ jsonArray=JSON.parseArray(txt_json.getText()); isArray=true; } catch (Exception ed){} if(jsonObject==null&&jsonArray==null){ JOptionPane.showMessageDialog(null,"该字符串不是json数组也不是json对象。"); return; } JOptionPane.showMessageDialog(null,"解析成功"); JsonStructTree jsonStructTree=new JsonStructTree(jsonObject,jsonArray); scroll_tree.getViewport().removeAll(); scroll_tree.getViewport().setView(jsonStructTree); } private void onCancel() { // add your code here if necessary dispose(); } public static void main(String[] args) { JSONViewer dialog = new JSONViewer(); dialog.pack(); dialog.setVisible(true); System.exit(0); } private void init(){ this.setPreferredSize(new Dimension(800,600)); cbox_tplType.addItem("js形式代码"); cbox_tplType.addItem("js精简形式代码"); setEvents(); } private void setEvents(){ btn_GenCode.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { //To change body of implemented methods use File | Settings | File Templates. if(cbox_tplType.getSelectedItem()==null){ JOptionPane.showMessageDialog(null,"请选择需要生成的模板!"); return; } String selectedTxt=cbox_tplType.getSelectedItem().toString(); if(selectedTxt.equals("js形式代码")){ if(jsonArray==null&&jsonObject==null){ JOptionPane.showMessageDialog(null,"您没有进行有效的json解析!"); return; } if(jsonObject!=null){ txt_result.setText(recursion_getChildNodeString(jsonObject,0,false,0,"")); return; } else{ txt_result.setText(recursion_getChildNodeString(jsonArray,0,false,0,"")); return; } } else if(selectedTxt.equals("js精简形式代码")){ if(jsonArray==null&&jsonObject==null){ JOptionPane.showMessageDialog(null,"您没有进行有效的json解析!"); return; } if(jsonObject!=null){ txt_result.setText(recursion_getChildNodeString(jsonObject,0,true,8,"..")); return; } else{ txt_result.setText(recursion_getChildNodeString(jsonArray,0,true,8,"..")); return; } } } }); } /** * @param parentObj 父亲节点。 * @param parentBlanks 父亲节点的空格数量。 * @param needLimitLength 是否需要限制值的长度 * @param limitLength 值的最大长度 * @param thumbTail 假如限制值长度,那么后面的后缀 * @return 字符串 * * */ private String recursion_getChildNodeString(Object parentObj,int parentBlanks,boolean needLimitLength,int limitLength,String thumbTail){ if(parentObj==null){ return ""; } String resStr=""; if(parentObj instanceof JSONObject){ JSONObject cobj=(JSONObject)parentObj; for(String keyName :cobj.keySet()){ Object childObj=cobj.get(keyName); if(childObj==null){ continue;} if(childObj instanceof JSONObject){ resStr+=StringUtil.repeatChar(' ',parentBlanks)+keyName+":{\n"; resStr+=recursion_getChildNodeString(childObj,parentBlanks+keyName.length()+2,needLimitLength,limitLength,thumbTail); resStr+=StringUtil.repeatChar(' ',parentBlanks+keyName.length()+2)+"};\n"; } else if(childObj instanceof JSONArray){ JSONArray objArr=(JSONArray)childObj; resStr+=StringUtil.repeatChar(' ',parentBlanks)+keyName+":[\n"; resStr+=recursion_getChildNodeString(objArr,parentBlanks+keyName.length()+2,needLimitLength,limitLength,thumbTail); resStr+=StringUtil.repeatChar(' ',parentBlanks+keyName.length()+2)+"];\n"; } else{ resStr+=StringUtil.repeatChar(' ',parentBlanks)+keyName+":"; String valueStr=childObj.toString(); if(needLimitLength){ resStr+="\""+ StringUtil.cutStr(valueStr,limitLength,thumbTail)+"\";\n"; } else{ resStr+="\""+ valueStr+"\";\n"; } } } return resStr; } else if(parentObj instanceof JSONArray){ JSONArray objArr=(JSONArray)parentObj; // resStr+=StringUtil.repeatChar(' ',parentBlanks)+"[\n"; for(int cindex=0;cindex< objArr.size();cindex++){ Object childObj=objArr.get(cindex); if(childObj instanceof JSONObject){ resStr+= recursion_getChildNodeString(objArr.get(cindex),parentBlanks+1,needLimitLength,limitLength,thumbTail); } else if(childObj instanceof JSONArray){ resStr+= recursion_getChildNodeString(objArr.get(cindex),parentBlanks+1,needLimitLength,limitLength,thumbTail); } else{ String valueStr=childObj.toString(); String dotStr=cindex>=objArr.size()-1?"":","; if(needLimitLength){ resStr+=StringUtil.repeatChar(' ',parentBlanks+2)+"\""+StringUtil.cutStr(valueStr,limitLength,thumbTail)+"\""+dotStr+"\n"; } else{ resStr+=StringUtil.repeatChar(' ',parentBlanks+2)+"\""+valueStr+"\""+dotStr+"\n"; } } } // resStr+=StringUtil.repeatChar(' ',parentBlanks)+"]\n"; return resStr; } else{ return ""; } } }
假如想试用的话,就到下面地址,
相关文章推荐
- 解决Eclipse报errors running builder ‘javascript validator’ on project .
- Rhino使JavaScript应用程序更灵动
- javascript学习之运动框架
- Javascript学习之无缝滚动
- js 悬浮广告
- JS 正则验证数字
- Json序列化和反序列化方法解析
- servlet中如何的到像jsp中的九个内置对象呢
- JavaScript社区开发者调查:服务端JS盛行,Backbone.js使用最多
- 教程:查找内存泄漏 (JavaScript)
- 找出并解决 JavaScript 和 Dojo 引起的浏览器内存泄露问题
- seaJs学习笔记之seaJs的准备
- Js内存泄露问题总结
- javascript优化
- JAVASCRIPT原型
- jsp的tag工作原理
- js期末总结二
- 二,JVM 自带命令行工具之JStat
- JSP和Servlet知识随记(一)
- JAVASCRIPT重生?