精华内容
下载资源
问答
  • JSON三种数据解析方法

    万次阅读 多人点赞 2018-01-15 13:05:01
    引言 JSON数据现在是我们开发中用的最多的,百分之八十的数据都是通过JSON方式进行传输,那么想要学好JSON解析就要了解什么是JSON数据,怎么快速解析它从而提升开发效率。

    JSON数据现在是我们开发中用的最多的,百分之九十的数据都是通过JSON方式进行传输,那么想要学好JSON解析就要了解什么是JSON数据,怎么快速解析它从而提升开发效率。

    1 什么是JSON数据?

    • 先看下面,这里有一段JSON数据,我们根据这段数进行讲解:
    {
      "paramz": {
        "feeds": [
          {
            "id": 299076,
            "oid": 288340,
            "category": "article",
            "data": {
              "subject": "荔枝新闻3.0:不止是阅读",
              "summary": "江苏广电旗下资讯类手机应用“荔枝新闻”于近期推出全新升级换代的3.0版。",
              "cover": "/Attachs/Article/288340/3e8e2c397c70469f8845fad73aa38165_padmini.JPG",
              "pic": "",
              "format": "txt",
              "changed": "2015-09-22 16:01:41"
            }
          }
        ],
        "PageIndex": 1,
        "PageSize": 20,
        "TotalCount": 53521,
        "TotalPage": 2677
      }
    }
    

    其实JSON数据就是一段字符串而已,只不过有不同意义的分隔符将其分割开来而已,我们看上面的符号,里面有[] ,{}等符号,其中

    • 1 []中括号代表的是一个数组;
    • 2 {}大括号代表的是一个对象
    • 3 双引号“”表示的是属性值
    • 4 冒号:代表的是前后之间的关系,冒号前面是属性的名称,后面是属性的值,这个值可以是基本数据类型,也可以是引用数据类型。

    2 了解了JSON数据的格式,怎么对这段数据进行解析呢?

    JSONObject系统自带的解析方式解析,我们先来JSONObject(系统自带的类)类中的方法:

    这里写图片描述

    • 上面用红框框出来的是我们手动解析最常用的方法了,好了,现在我们想要解析上面的一段数据,该怎么做呢?这里我写了一个解析类如下:
    public class JsonUtils {
    
        /**
         * 根据json数据解析返回一个List<HashMap<String, Object>>集合
         * @param json  json数据
         * @return
         */
        public static List<HashMap<String, Object>> getJsonList(String json) {
            List<HashMap<String, Object>> dataList;
            dataList = new ArrayList<>();
            try {
                JSONObject rootObject = new JSONObject(json);
                JSONObject paramzObject = rootObject.getJSONObject("paramz");
                JSONArray feedsArray = paramzObject.getJSONArray("feeds");
                for (int i = 0; i < feedsArray.length(); i++) {
                    JSONObject sonObject = feedsArray.getJSONObject(i);
                    JSONObject dataObject = sonObject.getJSONObject("data");
                    String subjectStr = dataObject.getString("subject");
                    String summaryStr = dataObject.getString("summary");
                    String coverStr = dataObject.getString("cover");
                    HashMap<String, Object> map = new HashMap<>();
                    map.put("subject", subjectStr);
                    map.put("summary", summaryStr);
                    map.put("cover", coverStr);
                    dataList.add(map);
                }
                return dataList;
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return null;
        }
    }
    

    相信很简单一看就懂了吧,此方法写起来主要是比较费时间罢了,无非就是几个方法不停的调用而已,所以显得特别的费时费力,下面我又写了一个解析的方法,方法中会有一些冗余的代码,是为了更加深刻理解JSON解析而写的,实际中可以删掉,也用了一行GSON解析,GSON解析下面会见讲到:

    其中DataModel对象我是将data对象使用GsonFormat插件工具生成的,使用方式可以自行搜索

    public class DataModel {
    
        /**
         * subject : "荔枝新闻3.0:不止是阅读"
         * summary : "江苏广电旗下资讯类手机应用“荔枝新闻”于近期推出全新升级换代的3.0版。"
         * cover : "/Attachs/Article/288340/3e8e2c397c70469f8845fad73aa38165_padmini.JPG"
         * pic :
         * format : video
         * changed : 2015-11-07 14:35:22
         */
    
        public String subject;
        public String summary;
        public String cover;
        public String pic;
        public String format;
        public String changed;
    
        @Override
        public String toString() {
            return "DataModel{" +
                    "subject='" + subject + '\'' +
                    ", summary='" + summary + '\'' +
                    ", cover='" + cover + '\'' +
                    ", pic='" + pic + '\'' +
                    ", format='" + format + '\'' +
                    ", changed='" + changed + '\'' +
                    '}';
        }
    }
    
     /**
         * 根据json对象获取List<DataModel>集合
         * @param json 数据
         * @return
         */
        public static List<DataModel> getGsonList(String json) {
            List<DataModel> dataList;
            try {
                JSONObject rootObject = new JSONObject(json);
                JSONObject paramzObject = rootObject.getJSONObject("paramz");
    
                /**
                 * JSONArray的构造方法获取JSONArray对象
                 */
                JSONArray jsonArray = new JSONArray(paramzObject.getString("feeds"));
                Log.i(TAG, "jsonarray.length():"+jsonArray.length());
    
                /**
                 * 获取JSONObject对象的属性关键字
                 */
                Iterator<String> iterators = paramzObject.keys();
                while (iterators.hasNext()) {
                    Log.i(TAG, "iterators: " + iterators.next());
                }
                JSONArray feeds = paramzObject.getJSONArray("feeds");
                dataList = new ArrayList<>();
                for (int i = 0; i < feeds.length(); i++) {
                    JSONObject jsonObject = feeds.getJSONObject(i);
                    DataModel model = new Gson().fromJson(jsonObject.getString("data"), new TypeToken<DataModel>() {
                    }.getType());
                    Log.i(TAG, "DataModel: " + model.toString());
                    dataList.add(model);
                }
                return dataList;
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
            return null;
        }
    

    简单总结一下上面的解析吧:

    1 对于JSONObject对象来说,想要得到一个JSONObject对象通常可以通过

    • (a):构造方式:JSONObject(String json)-> JSONObject rootObject = new JSONObject(json);
    • (b):JSONObject getJSONObject(String name){}-> JSONObject paramzObject = rootObject.getJSONObject(“paramz”);

    2 对于JSONArray对象来说,想要得到一个JSONArray对象通常可以通过

    • (a):构造方式:JSONArray(String json)->JSONArray jsonArray = new JSONArray(paramzObject.getString(“feeds”));
    • (b):JSONObject getJSONObject(String name){}-> JSONArray feeds = paramzObject.getJSONArray(“feeds”);

    3 Gson解析

    我们如果懂得了上面的手动解析方式的话,那么对于Gson解析而言,就太简单了,下面我们就开始解析下面一段JSON数据:

    {
        "homeadlist": [
            {
                "id": 1,
                "imgurl": "/img/homead/a73b3f1d-0f14-429d-9d0f-70643fb0f0eb.jpg",
                "jumpflag": 0,
                "jumpurl": "",
                "posflag": 1,
                "remark": "1111",
                "cityid": 1
            },
            {
                "id": 12,
                "imgurl": "/img/homead/eb442fbf-49db-4ba6-a102-d781505f426d.jpg",
                "jumpflag": 0,
                "jumpurl": "",
                "posflag": 2,
                "remark": "",
                "cityid": 1
            },
            {
                "id": 14,
                "imgurl": "/img/homead/68109460-635d-4c5c-8be8-64d7c7889d18.jpg",
                "jumpflag": 0,
                "jumpurl": "http://shiranlife.kuaizhan.com/",
                "posflag": 4,
                "remark": "",
                "cityid": 1
            }
        ]
    }
    

    首先我们使用GsonFormat工具生成一个类HomeadListModel:

    public class HomeadListModel {
    
        /**
         * code : 1
         * data : {"homeadlist":[{"id":1,"imgurl":"/img/homead/a73b3f1d-0f14-429d-9d0f-70643fb0f0eb.jpg","jumpflag":0,"jumpurl":"","posflag":1,"remark":"1111","cityid":1},{"id":12,"imgurl":"/img/homead/eb442fbf-49db-4ba6-a102-d781505f426d.jpg","jumpflag":0,"jumpurl":"","posflag":2,"remark":"","cityid":1},{"id":14,"imgurl":"/img/homead/68109460-635d-4c5c-8be8-64d7c7889d18.jpg","jumpflag":0,"jumpurl":"http://shiranlife.kuaizhan.com/","posflag":4,"remark":"","cityid":1}]}
         */
    
        public int code;
        public DataBean data;
    
        public static class DataBean {
            public List<HomeadlistBean> homeadlist;
    
            public static class HomeadlistBean {
                public int id;
                public String imgurl;
                public int jumpflag;
                public String jumpurl;
                public int posflag;
                public String remark;
                public int cityid;
            }
        }
    }
    
    

    我们使用OKHttpClient,代码如下

    OkHttpClient.Builder builder = new OkHttpClient.Builder();
    
            Request request = new Request.Builder()
                    .url(url)
                    .get()
                    .build();
    
            builder.build().newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
    
                }
    
                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    Gson gson = new Gson();
                    /**
                     * java.lang.IllegalStateException: closed
                     * 因为OkHttp请求回调中response.body().string()只能有效调用一次
                     *
                     */
    
                    String string = response.body().string();
                    Log.i("aaa", "response: " + string);
                    /**
                     * 重新构建一个response 因为response.body().string()调用一次之后流就断掉了,只能有效调用一次
                     */
                    MediaType mediaType = response.body().contentType();
                    Response response1 = response.newBuilder().body(ResponseBody.create(mediaType, string)).build();
                    String string1 = response1.body().string();
                    Log.i("aaa", "response1: " + string1);
                    /**
                     * 将json数据转换为对象
                     */
                    HomeadListModel model = gson.fromJson(string1, HomeadListModel.class);
                    //HomeadListModel model2 = gson.fromJson(string1, new TypeToken<HomeadListModel>() {
                    }.getType());
                    /**
                     * 将对象转换为json数据
                     */
                    String jsonString = gson.toJson(model);
                    Log.i("aaa", "onResponse2: " + jsonString);
    
                    for (HomeadListModel.DataBean.HomeadlistBean data : model.data.homeadlist) {
                        mData.add(imageUrl + data.imgurl);
                    }
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            mAdapter.notifyDataSetChanged();
                        }
                    });
                }
            });
    

    我们想要将一个json数据转换为对象的话需要使用fromJson(String json, Class classOfT) /fromJson(String json, Type typeOfT),当我们需要将对象转换为String的时候根据String toJson(Object src)方法即可。这里需要注意一点,如果response.body().string()调用大于一次的话,就会报错java.lang.IllegalStateException: closed,因为response.body().string()调用一次之后流就断掉了,需要重新构建一个response;


    4 FastJson解析

    • 这个解析和Gson解析差不多,也是一行就搞定了,也是对上面的Gson数据进行解析,想要将json数据解析成对象需要使用 parseObject()方法,参数可以传Class,也可以传Type;当需要通过对象得到String字符串时候使用String json1 = JSONObject.toJSONString(model)即可,下面贴上代码:
    OkHttpClient.Builder builder = new OkHttpClient.Builder();
            Request request = new Request.Builder()
                    .url(url)
                    .get()
                    .build();
            builder.build().newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
    
                }
    
                @Override
                public void onResponse(Call call, Response response) throws IOException {
    
                    String json = response.body().string();
                    /**
                     * 根据json数据获取对象
                     */
                    HomeadListModel model = JSONObject.parseObject(json, new TypeToken<HomeadListModel>() {
                    }.getType());
    //                HomeadListModel model2 = JSONObject.parseObject(json, HomeadListModel.class);
    
                    /**
                     * 根据对象获取json数据
                     */
                    String json1 = JSONObject.toJSONString(model);
                    Log.i("aaa", "fastJson: " + json1);
    
                    for (HomeadListModel.DataBean.HomeadlistBean data : model.data.homeadlist) {
                        mData.add(imageUrl + data.imgurl);
                    }
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            mAdapter.notifyDataSetChanged();
                        }
                    });
                }
            });
    

    结尾:上面写了三种解析JSON数据的方法,第一种是最麻烦的,但是不一定是最差的,后面两种Gson和FastJson都是最常用的方法,本博客里面用到的API也是最常用的API,基本开发都够用了,其余未涉及到的请自行查看源码学习吧。


    想要系统学习Android知识体系的,可以免费关注我的博客和Github,你的关注和支持是每一个技术人前进的动力。

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • modbus数据获取与数据解析

    千次阅读 多人点赞 2020-01-08 11:33:20
    modbus数据解析与获取,讲解,需要modbus poll的可以私信我,这里主要的部分就是解析数据了,将16进制数据解析为10进制数据。

    #代码部分

    首先注意一点Python版的modbus要获取modbus值必须先装【环境包】
    pip install serial 
    # serial为串口包,需要打开串口,也就是usb
    pip install crcmod
    # crcmod 用来crc校验的
    pip install modbus_tk
    # modbus_tk 就是满足modbus协议的Python包
    
    import crcmod
    from binascii import unhexlify
    import modbus_tk
    import time
    import serial
    from modbus_tk import modbus_rtu
    from modbus_tk import defines as cst
    import logging
    
    
    def crc16Add(read):
        try:
            crc16 = crcmod.mkCrcFun(0x18005, rev=True, initCrc=0xFFFF, xorOut=0x0000)
            readcrcout = hex(crc16(unhexlify(read))).upper()
            str_list = list(readcrcout)
            if len(str_list) == 5:
                str_list.insert(2, '0')  # 位数不足补0,在列表中下标为2的加入元素0
            crc_data = "".join(str_list)
            read = read.strip() + crc_data[4:] + crc_data[2:4]
            return read
        except:
            # print("crc校验出错'")
            logging.warning('crc校验出错')
    
    flag_value = True
    def modbus_getdate(slave_id, start_addr, date_len):
        try:
            master = modbus_rtu.RtuMaster(serial.Serial(port=PORT,
                                                        baudrate=19200,
                                                        bytesize=8,
                                                        parity='N',
                                                        stopbits=1,
                                                        xonxoff=0))
            # # logger = modbus_tk.utils.create_logger(name="console", record_format="%(message)s")
            master.set_timeout(3)
            master.set_verbose(True)
            # holding_date = master.execute(slave_id, cst.READ_HOLDING_REGISTERS, start_addr, date_len)
            holding_date = master.execute(slave=slave_id,function_code=cst.READ_HOLDING_REGISTERS,quantity_of_x=date_len,starting_address=start_addr)
            holding_data125 = list()
            for i in range(len(holding_date)):
                holding_data125.append('%04x' % (holding_date)[i])  # append()在Tmp1列表末尾添加新的对象
            all_holding_data = '0103' + '%02x' % (date_len * 2) + ''.join(holding_data125)  #
            # return str(all_holding_data)
            return crc16Add(all_holding_data) #这里crc校验了,如果单纯的看数据可以不校验
        
        except modbus_tk.modbus_rtu.ModbusInvalidResponseError as err:
            # print(err)
            logging.warning(err)
    
    def get_s16(val):
        '''
        作用为解析16进制有符号数,值得注意的是modbus poll是不支持有符号数的,一会先讲个modbus poll的用法
        '''
        if val > 65536:
            return val/100 
        
        elif val > 32768:
            #因为我传的数是需要有2位小数的,但是16进制中没有小数点的概念,所以数本身扩大100倍,然后做处理再除以100,就得到小数点后2位
            return (val - 65536)/100
        else:
            return val/100
    
    def f_analysis(x):
        '''
        解析4位一个的16进制数
        '''
        les = len(x)
        print(les,'数据长度')
        for i in range(les):
            if i % 4  == 0:
                # print(i,j)
                datas = int(x[i:i+4],16)
                print(i,get_s16(datas),datas) # i代表循环位置,get_s16()为解析16进制有符号数,datas为16进制数
    
    
    
    if __name__ == '__main__':
        PORT = 'COM12'
        flag = True
        for i in range(2):
            if flag:
                da = modbus_getdate(slave_id=1,start_addr=0,date_len=16)
                print(da) # modbus取出的值
                # master.execute(slave=1, function_code=cst.WRITE_MULTIPLE_REGISTERS, starting_address=0,
                #                data_format='0')
                f_analysis(da[6:-4])
                # 不需要前6个和后四个原因是,前6个值是我为了协议拼接的,后四个是crc校验生成的,所以它们不是数据,不需要。
    
    结果如下 ,因为是8个温度探头,但只有前三个接了真正的探头,所有只有前三个有值,而且还重复了,不过这不影响。哈哈
    01032007920793084ef510f510f510f510f51007920793084ef510f510f510f510f510B741
    64 数据长度
    0 19.38 1938
    4 19.39 1939
    8 21.26 2126
    12 -28.0 62736
    16 -28.0 62736
    20 -28.0 62736
    24 -28.0 62736
    28 -28.0 62736
    32 19.38 1938
    36 19.39 1939
    40 21.26 2126
    44 -28.0 62736
    48 -28.0 62736
    52 -28.0 62736
    56 -28.0 62736
    60 -28.0 62736
    
    讲个modbus poll 的用法,其实modbus poll 和我上面的代码的作用是一样的,但是modbus poll 是写好的工具,
    且只支持215次 以内的数据,也就是32768,这个整数,一旦你要发送有符号数,216次 时它就不能解析了。
    下面请看不能解析的部分
    

    在这里插入图片描述

    这不是我要的结果
    
    正确结果为,因为 前3个是采集的温度数据,所以19381956是变化的,想表示的就是19.38摄氏度。
    

    在这里插入图片描述

    讲讲modbus poll和我代码之间的关系
    modbus poll参数设置
    

    在这里插入图片描述

        端口为 com12
    

    在这里插入图片描述

    子站数为1,地址从0开始,取16个寄存器的值
    
    代码参数设置
    

    在这里插入图片描述

    这个代码参数设置,在代码中可以找到
    

    在这里插入图片描述

    展开全文
  • 航空ADSB数据解析

    千次阅读 2020-02-06 14:04:26
    无聊的假期,研究了一套ADSB设备数据,...因为有各种国家版本标准,所以综合了一下写了一套数据解析方案,其中包括了adsb数据,modes数据,acars报文数据,这三个研究完成,AIS和modeA/C还没有研究透标准文档,目前...

    无聊的假期,研究了一套ADSB设备数据,因为航空管制要求,都是十六进制数据。

    简单思路写一套socket监听adsb设备端口,获取数据,解析数据,得到飞机返回数据,包括速度,经纬度,高度,海里,角度等各种信息。

    因为有各种国家版本标准,所以综合了一下写了一套数据解析方案,其中包括了adsb数据,modes数据,acars报文数据,这三个研究完成,AIS和modeA/C还没有研究透标准文档,目前来看还算成功,并没有校验过数据准确性。

    解析出结果如下:

    商务技术咨询5K起,商务研发1w起!博文留言或者私信联系我!

    重点来了

    重点来了

    重点来了

    鉴于前段时间板块里面闹的那个事情,预算不够者或者伸手党就勿扰了,高端产品,价值放在那里,外面随便一套方案都3w起,我只是闲来无聊随便搞的,给不起钱就别逼逼,浪费你我的时间!

    展开全文
  • Python通过Django搭建网站实现Lua脚本数据解析 论Python与Lua交互有多种,但很多仅凭纯Script操作不是很爽,有个网页UI操作着会方便些。 使用Python的Django搭个Bin-Json消息转换网站,App/Cloud/Device三方通过...


    Python通过Django搭建网站执行Lua脚本 (实现数据解析)

    论如何优雅的进行Python与Lua交互,当然方法有多种,但很多仅凭纯Script操作不是很爽,本文就通过网页形式实现,实际操作来讲,有个网页UI操作也会方便很多。

    一、问题背景和解决

    • 背景: 之前某IoT项目,Device端与Cloud/App端数据通讯Protocol包括Binary、Json格式,全部由lua进行解析(实际是binary与json格式之间相互转换,是由于某系列设备只能用binary),但Lua脚本出bug不好排查,特别是App/Cloud/Device三方联调中要核对一堆消息,有个符号错了都会导致解析失败

    • 问题:我们作为Device端开发人员写的Lua脚本,需要部署到Cloud的Paas上,该类Device上下行的数据都要通过Lua进行Binary - Json互转,才能正确处理,因此Lua出了问题,App/Cloud team需要把消息发给我们本地执行lua后,再和App/Cloud 检查消息, 非常麻烦,当然我是懒人,这么麻烦的也忍不了。

    • 解决:使用Django搭个Bin-Json消息转换网站,App/Cloud/Device三方通过网站对消息数据 执行lua解析转换,检查各方数据是否有误。

    项目使用的lua脚本只能在linux环境执行, 所以也做不了exe,所以通过网页形式开放给各开发人员,是最快捷方便的。

    二、执行Lua效果预览

    • Json转Binary:(会自动识别消息类型进行转换)
    在这里插入图片描述
    • Binary转Json:

    在这里插入图片描述

    如果解析失败,Django的console里也可以看error log:
    在这里插入图片描述

    • 登录界面

    在这里插入图片描述
    Django登录页面来自于: 刘江的Django教程

    三、主要代码解析:

    translate.py

    translate.py接收Bin-Json转换页面 输入框的待转换消息,写入到msgInput.txt,
    然后通过调用subprocess 的check_output执行 luaParser.lua(消息解析脚本)进行转换,并将转换完成的消息写入 msgOutput.txt, 最后将转换后的结果传回页面显示。

    # -*- coding: utf-8 -*-
     
    from django.shortcuts import render
    from django.views.decorators import csrf
    from django.shortcuts import redirect
    
    #from translator import translator
    import subprocess as ss
    import sys
    import traceback
    
    msgInput_FileName = "msgInput.txt"
    msgOutput_FileName = "msgOutput.txt"
    
    
    def WritetoFile(FileName,Data):
        #fileName= 'record.txt'
        with open(FileName,'w') as record:
            strr = ""
            content = strr.join(Data)
            record.write(content+'\n')
            
    def ReadFile(FileName):
        fileName = FileName
        with open(fileName) as record:
            lines = record.read().splitlines()
            #print(lines)
            return lines
     
    # handle POST request data
    def translate_post(request):
        if not request.session.get('is_login', None):
            return redirect('/login/')
        
        ctx ={}
        if request.POST:
            #Get input from post
            MsgInput  = request.POST['q']
            print('Input from WebPage is:'+MsgInput)
            WritetoFile(msgInput_FileName, MsgInput)
            message = '输入为空, 请检查填写的内容!'
            
            #input check
            if MsgInput.strip():
                try:
                    luaPrint = ss.check_output(['lua luaParser.lua'],shell=True)
                    #print (luaPrint)
                    Msgoutput = ReadFile(msgOutput_FileName)
                    #print (Msgoutput)
                except ss.CalledProcessError as exc:  
                    print(exc.returncode)
                    print(exc.output)
                    #Error log
                    tblog = traceback.format_exc()
                    Msgoutput = 'Error in Lua:'+str(exc.output)
                    Msgoutput+= '.....................ErrorCode is:'+ str(exc.returncode)
                    Msgoutput+= '.....................ErrorLog is:'+ tblog
            
                ctx['rlt'] = Msgoutput
                ctx['msgInput'] = MsgInput
                
                #return a dictionary
                return render(request, "login/index.html", ctx)
            else:
                return render(request, "login/index.html", {'message': message})
    
        return render(request, 'login/index.html', locals())
    
    
    if __name__ == '__main__':
        if(sys.argv[1:] == []):
            print('Not input parameter , Use latest Data in msgInput.txt...')
        else:
            MsgInput = sys.argv[1]
            WritetoFile(msgInput_FileName, MsgInput)
            
    

    msgInput.txt和msgOutput.txt文件作为消息数据缓存:

    在这里插入图片描述

    LuaParser.lua

    luaParser.lua读取msgInput.txt判断输入消息是binary 还是json数据,然后调用相应的script进行转换,转换后的数据写入msgOutput.txt,供页面显示

    --Howard Xue , 20190322
    
    launch = require'decode_launch'
    code = launch'xxxchinaxxx.lua'
    
    msgInput_FileName = "msgInput.txt"
    msgOutput_FileName = "msgOutput.txt"
    
    -- File Operation
    function readMsgfile(filename)  
    	file = io.open(filename, "r")
    
    	MsgRead = file:read()
    	--print(MsgRead)
    
    	file:close()
    end 
    
    
    function writeMsgfile(path, content)
       mode = "w+"
       local file = io.open(path, mode)
       if file then
         if file:write(content) == nil then return false end
         io.close(file)
         return true
       else
         return false
     end
    end
    
    
    -- Main begin
    
    isBin2Json = isMsgData_Binary(msgInput_FileName)
    
    readMsgfile(msgInput_FileName)
    
    if isBin2Json == true then
    -- Hex to Json
    	print(" Bin --> Json :")
    	outputData = code.convertFromDevice(code.hex(MsgRead))
    	writeMsgfile(msgOutput_FileName, outputData)
    	print(outputData)
    else
    --Json to Hex
    	print(" Json --> Bin :")
    	--print(code.hexDump(code.convertToDevice(MsgRead)))
    	outputData = code.hexDump(code.convertToDevice(MsgRead))
    	writeMsgfile(msgOutput_FileName, outputData)
    	print(outputData)
    end
    
    
    --readMsgfile(msgOutput_FileName)
    --print(MsgRead)
    
    -- Hex to Json
    --print("Msg Output is:")
    --print(code.convertFromDevice(code.hex(MsgRead)))
    
    
    

    Bin-Json转换页面

    login/index.html,在输入框内输入待转换的数据后,点击一键转换,submit数据到translate.py, 并将转换后的结果(rlt 即msgOutput)显示出来。

    {% load static %}
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <!-- Required meta tags -->
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    
        <!-- Bootstrap CSS -->
          <link href="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet">
          <link href="{% static 'login/css/login.css' %}" rel="stylesheet" />
    
        <title>Bin-Json转换</title>
      </head>
    <body>
    
    
    <br><br />
    
      <div class="container">
      
      <h1 style="color:#FFFFF0">{{ request.session.user_name }}!  欢迎回来! </h1>
      
      <p>
        <a style="color:#F08080" href="/logout/">退出登录</a>
      </p>
    <br> <br />
                <div class="col">
    			  
    			   <form action="/translate/" method="post">
    					{% csrf_token %}
    					{% if message %}
                          <div class="alert alert-warning">{{ message }}</div>
    					{% endif %}
    					
    					<input type="text" name="q" style="width:800px;height:50px;font-size:15px" placeholder="输入二进制或json消息" autofocus >
    					<!-- <input type="submit" value="Submit"> -->
    					 <button type="submit" class="btn btn-primary">一键转换</button>
    			   </form>
    			   
    			   <div style="color:#FFFF00;word-break:break-all">: 如果转换结果为Error, 请检查输入数据正确性,以及脚本是否报错</div>
                </div>
    			
    			
    				<div style="font-family:verdana;padding:20px;border-radius:10px;border:5px solid #EE872A;">
    				
    						<h3>Result:</h3>
    
    						<div style="color:#000000;word-break:break-all">{{ rlt }}</div>
    
    				</div>
    				<br><br/>
    				<div style="font-family:verdana;padding:20px;border-radius:10px;border:5px solid #EE872A;">
    				
    						<h3>Input:</h3>
    
    						<div style="color:#000000;word-break:break-all">{{ msgInput }}</div>
    
    				</div>
      </div> <!-- /container -->
    
        <!-- Optional JavaScript -->
        <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    
        <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
        <script src="https://cdn.bootcss.com/popper.js/1.15.0/umd/popper.min.js"></script>
        <script src="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script>
    
    </body>
    </html>
    

    urls.py

    添加translate URL对应关系

    from django.contrib import admin
    from django.conf.urls import url
    from django.urls import path
    from django.urls import include
    from login import views, translate
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('index/', views.index),
        path('login/', views.login),
        path('register/', views.register),
        path('logout/', views.logout),
        path('confirm/', views.user_confirm),
        path('captcha/', include('captcha.urls')),
      
        path('translate/', translate.translate_post),
    ]
    
    

    其他好玩的python脚本

    Python实现自动发送邮件 --自动抓取博客/网站中留言的邮箱并发送相应邮件
    Python自动生成代码 - 通过tkinter图形化操作并生成代码框架
    Python解析CSV数据 - 通过Pandas解析逻辑分析仪导出的CSV数据
    Python通过Django搭建网站执行Lua脚本 (实现数据解析)

    展开全文
  • 文章目录一、背景二、总结内容2.1 UDP通信服务端创建方式**DUP采用的是无连接的套接字**2.2 16进制数据解析2.3 文件创建与数据储存分析 一、背景 最近在处理公司的一设备,内置的DTU通过UDP向服务器发送16进制的数据...
  • 全网最简单的C# json数据解析无敌菜鸟教程十分钟搞定json数据解析废话先说一点,算了。直接进入正题吧。 用例子说话:JSON数据:string json: " { "Result": "A01", "List": [ { "name": "王艳", "sex": "F", ...
  • 数据解析软件是通过TCP或者UDP连接ADS-B接收机,实时解析并通过UDP输出明文,方便用户开发应用系统 数据解析软件分两种:一种是MAC地址版,一种是无限制版本。MAC地址版需要用户提供运行数据解析软件的PC的MAC地址,...
  • json-handle谷歌浏览器json数据解析工具

    千次下载 热门讨论 2014-10-24 08:26:23
    json-handle谷歌浏览器json数据解析工具,装了此插件,在访问json数据时,自动解析成清晰的json格式.不用再为json而看得头晕眼花.此插件的使用:打开谷歌浏览器,到设置里面的拓展程序,然后勾选最上面的开发者模式,最后...
  • 将设备上报的原数据直接透传到物联网平台。物联网平台调用您提交的数据解析脚本,将设备上行数据解析为物联网平台定义的标准格式(Alink JSON),再进行业务处理
  • GPS数据解析

    千次阅读 2011-09-18 20:13:05
    实例下载:... 前段时间做了GPS接收机的数据解析相关的开发工作,因为需要对GPS接收机的定位数据进行解析而阅读了novatel的某型号的主板说明说,对这方面有一些了解就记录下来,做个备
  • OpenDrive格式地图数据解析

    千次阅读 2019-04-02 21:00:36
    OpenDrive格式地图数据解析 参考: https://www.opendrive.com/ http://www.opendrive.org/index.html
  • Python数据解析

    千次阅读 2018-12-30 17:23:32
    Python语言在人工智能以及计算机视觉领域十分热门,它处理数据的能力很出色,兼容各种常用的数据类型解析。程序无非就是一系列数据操作行为的集合,从输入到输出以求得人们期望的结果。Python在执行效率和开发效率中...
  • opendrive地图数据解析算法

    千次阅读 热门讨论 2019-03-21 12:16:40
    首先感谢github大佬@Stefan Urban 首先geometry类型paramPoly3,相对简单,在计算车道...附odr数据解析python核心代码, 一、uv坐标系转xy坐标系: double u = aU + bU * p + cU * p * p + dU * p * p* p; doubl...
  • iOS 网络请求及数据解析

    千次阅读 2016-03-15 09:14:42
    iOS 网络请求,数据解析
  • Kotlin配合Gson进行json数据解析

    千次阅读 2017-08-04 10:04:58
    Kotlin配合Gson进行json数据解析 昨天写的小demo里使用到了这个 1,首先引入第3方库implementation 'com.squareup.okhttp3:okhttp:3.8.1' implementation 'io.reactivex.rxjava2:rxjava:2.1.2' implementation 'io....
  • java访问http并获得json数据解析json数据 需要fastjson-1.1.24.jar 此方法必须访问http请求,访问https需要httpclient 具体方法: @RequestMapping("geturl.do")   public void geturl(HttpServletResponse...
  • android 数据解析 JSON 开发详解

    千人学习 2016-04-28 13:58:39
    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。学习 android 数据交换格式 JSON 介绍,JSON 的解析和生成;
  • 冰点下载:数据解析错误

    千次阅读 2018-06-04 08:28:00
    问题描述:数据解析错误 解决方案: 上图网址:https://tieba.baidu.com/p/5630852260?red_tag=0698642778 确定为方案1:下载最新版 下载软件网址:http://www.bingdian001.com/?p=30 解压运行,效果如下...
  • 基于Socket的十六进制数据解析 数据解析的思路 基本思路 消息结构体,存储从缓存中解析的数据; buffer 回调函数,从缓存中解析数据时调用; 循环队列,用于缓存接收到的数据; 关键实现: 把接收到的数据存储到...
  • layui数据解析parseData: function(res)

    千次阅读 2020-07-20 17:43:45
    layui数据解析,后端要写啥?前端又要写啥? 官网https://www.layui.com/doc/modules/table.html#options 一开始看官网看的云里雾里,自己琢磨结合网上的资料终于可以初步使用了,下面是一个具体的使用例子。 依据...
  • 生意参谋 data 16进制数据解析还原

    千次阅读 多人点赞 2019-03-16 22:01:40
    生意参谋 data 16进制数据解析还原攻略 前言:小弟,入手JavaScript并不太久,也是第一次看*宝后台这代码写法,头疼的厉害(我并不是大佬,只是奋战在前线的搬码工,嚯嚯嚯~);此次发这个帖子,正好是应朋友的...
  •  本期问题:Android端接收后台数据解析失败  解决思路:本项目后台数据返回json数据,但可能跟android需求或者框架转换需求格式略有不同,所以可能存在解析失败问题  最终解决路径:  ...
  • 我查网上的资料,gps数据解析中的GetComma()函数很好用,那应该包含什么头文件才能使用?还是这个是自定义的?
  • IOS 请求数据解析 XML 和 JSON

    千次阅读 2014-01-06 21:41:44
    这一段主要接触的就是数据解析,就说一下数据解析 现在数据解析一般解析两种数据 xml 和 JSON 那就从xml解析说起吧 xml解析需要用到一个类 NSXMLParser 以及一个协议 NSXMLParserDelegate 首先NSXMLParser是一个...
  • Android知识体系总结之Android部分之网络数据解析篇 1.Json数据解析 JSONOBjcet FastJson Gson 三者对比 2.XML数据解析 Dom Sax Pull 三者比较

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 186,222
精华内容 74,488
关键字:

数据解析