首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Micropython: json文件中的字节数组

Micropython: json文件中的字节数组
EN

Stack Overflow用户
提问于 2021-05-13 13:56:34
回答 1查看 198关注 0票数 0

我在最新版本中使用了micropython。我也是一个DS18b20温度传感器。这些传感器的入口是“b”(b\xe5V\xb5\x01<:‘“)。这些是字节数组的字符串表示形式。如果我使用它来保存json文件中的入口,我会运行一些问题:

如果我直接存储“b‘( b'(b\xe5V\xb5\x01<:':’”),在读取json-文件之后,就没有单独的反斜杠,并且我得到b'(bxe5Vxb5x01<:‘inside python

  • ,如果我避开像“b’这样的反斜杠(b\xe5V\xb5\x01<:‘我在python:中得到双反斜杠)”

我怎么才能得到一个反斜杠?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2021-05-15 04:45:20

您不能用bytesJSON中保存micropython。就JSON而言,这只是一些字符串。即使你能得到你想要的东西。(单反斜杠)仍然不会是bytes。所以,你面临着某种形式的转换,不管-什么。

一个想法是,您可以将其转换为int,然后在打开它时将其转换回来。下面是一个简单的例子。当然,您不需要有一个classstaticmethods来完成这个任务。这似乎是一个很好的方法,把它包装成一个整体,甚至不需要它的一个实例在周围徘徊。您可以将整个class转储到其他文件中,将其转储到必要的文件中,然后根据需要调用它的方法。

代码语言:javascript
复制
import math, ujson, utime


class JSON(object):
    @staticmethod
    def convert(data:dict, convert_keys=None) -> dict:
        if isinstance(convert_keys, (tuple, list)):
            for key in convert_keys:
                if isinstance(data[key], (bytes, bytearray)):
                    data[key] = int.from_bytes(data[key], 'big')
                elif isinstance(data[key], int):
                    data[key] = data[key].to_bytes(1 if not data[key]else int(math.log(data[key], 256)) + 1, 'big')
        return data
    
    @staticmethod
    def save(filename:str, data:dict, convert_keys=None) -> None:
        #dump doesn't seem to like working directly with open
        with open(filename, 'w') as doc:
            ujson.dump(JSON.convert(data, convert_keys), doc) 

    @staticmethod
    def open(filename:str, convert_keys=None) -> dict:
        return JSON.convert(ujson.load(open(filename, 'r')), convert_keys)
    

#example with both styles of bytes for the sake of being thorough
json_data = dict(address=bytearray(b'\xFF\xEE\xDD\xCC'), data=b'\x00\x01\02\x03', date=utime.mktime(utime.localtime()))

keys = ['address', 'data'] #list of keys to convert to int/bytes

JSON.save('test.json', json_data, keys)

json_data = JSON.open('test.json', keys)

print(json_data) #{'date': 1621035727, 'data': b'\x00\x01\x02\x03', 'address': b'\xff\xee\xdd\xcc'}

您可能还需要注意,使用此方法,您永远不会实际接触任何JSON。你输入一个dict,你就会得到一个dict。所有的JSON都是“幕后”管理的。不管这一切,我认为使用struct是一个更好的选择。你是这么说的JSON,我的回答是关于JSON的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67520510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档