Search code examples
pythonjsonsocketstelnet

How to convert socket data to json object or to Dictionary with Python 3


So I am trying to convert data from socket to json object. below is my python code that gets data from socket server.

import socket

HOST = "myHOST"
PORT = myPORT
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((myHOST, myPORT))
    s.sendall(b" ")
    buffer_size = 4096
    print("Received: ")
    while True:
        data = s.recv(buffer_size)
        print(repr(data))
s.close()

I am getting this data as an output:

Received: 
b'2018-08-06T17:35:45.0612|power|ON|mode|MANUAL|execution|READY|Xact|215.13|Yact|331.34|Zact|22.16|Xcom|0.00|Ycom|0.00|Zcom|0.00|path_feedrate|0.00|line|0|Block|0|program|Plate 1_imported_dxf.ORD\n'
b'2018-08-06T17:35:45.0612|comms|NORMAL||||\n2018-08-06T17:35:45.0612|Sspeed|0.00\n'

And now I want to convert it to formatted json object so that i can later use it on my html with javascript. I tried to create json object within my while loop by:

import socket
import json

HOST = "myHOST"
PORT = myPORT
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((myHOST, myPORT))
    s.sendall(b" ")
    buffer_size = 4096
    print("Received: ")
    while True:
        data = s.recv(buffer_size)
        print(repr(data))

        json_obj = json.loads(data)
        print(type(json_obj))
        print(json_obj.get("power").get("mode"))
s.close()

But i cant make it to work. I also tried to use json.dumps but no success. Please help guys! I also tried to make a dictionary but no success, getting error: ValueError: too many values to unpack (expected 2). Below is the snippet for my dictionary try:

while True:
    data = s.recv(buffer_size).decode("utf-8")
    print(data)
    d = {}
    for pair in data.replace(' ', '').split(', '):
        k, v = pair.split('|')
        d[k] = int(v)
    print(d)

I want the answer to have key value pairs.


Solution

  • import socket
    
    HOST = "myHOST"
    PORT = myPORT
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect((myHOST, myPORT))
        buffer_size = 2048
        print("Received: ")
        while True:
            devData = s.recv(buffer_size).decode("utf-8").split("|")
            timeStamp = devData.pop(0)
            devDict = dict(zip(*([iter(devData)]*2)))
            print(devDict)
    s.close()
    

    And this is the result that I get:

    Received: 
    {'power': 'ON', 'mode': 'MANUAL', 'execution': 'READY', 'Xact': '1113.21', 'Yact': '162.60', 'Zact': '0.00', 'Xcom': '0.00', 'Ycom': '0.00', 'Zcom': '0.00', 'path_feedrate': '0.00', 'line': '0', 'Block': '0', 'program': '37255 S1 D - .75 JET_imported_dwg.ORD\n'}
    {'comms': 'NORMAL', '': '\n2018-08-07T20:40:05.0432', 'Sspeed': '0.00\n'}
    {'program': '37255 S1 D - .75 JET_imported_CNC.ORD\n'}
    {'power': 'ON', 'mode': 'MANUAL', 'execution': 'READY', 'Xact': '1113.21', 'Yact': '162.60', 'Zact': '0.00', 'Xcom': '0.00', 'Ycom': '0.00', 'Zcom': '0.00', 'path_feedrate': '0.00', 'line': '0', 'Block': '0', 'program': '37255 S1 D - .75 JET_imported_CNC.ORD\n'}
    {'comms': 'NORMAL', '': '\n2018-08-07T20:43:57.0375', 'Sspeed': '0.00\n'}