【问题标题】:Convert dot delimited string to json Python将点分隔字符串转换为 json Python
【发布时间】:2020-07-17 10:48:14
【问题描述】:

我有一个点分隔的字符串,我需要将其转换为 Json。这是一个包含不同类型字符串的示例:

my.dictionary.value -> value
my.dictionary.list[0].value -> value
my.dictionary.list[1].value.list[0].value -> value

使用递归方法转换第一种类型的字符串没有问题:

def put(d, keys, item):
    if "." in keys:
        key, rest = keys.split(".", 1)
        if key not in d:
            d[key] = {}
        put(d[key], rest, item)
    else:
        d[keys] = item

但我正在努力寻找列表的解决方案。是否有提供开箱即用的字符串到 json 转换的库?感谢您的宝贵时间。

【问题讨论】:

    标签: python json


    【解决方案1】:

    AFAIK,没有任何模块可以做到这一点

    这里是一个将一系列带点字符串转换为 json 格式的示例代码。当您在将用作键的字符串中看到模式 [n] 时,您只需创建一个新列表。

    import re
    import json
    
    def parse_dotted_strlines(strlines):
        res= {}
        for line in strlines.splitlines():
            parse_dotted_str(line, res)
        return res
    
    def parse_dotted_str(s, res):
        if '.' in s:
            key, rest = s.split('.', 1)
            # Check if key represents a list
            match = re.search(r'(.*)\[(\d)\]$', key)
            if match:
                # List
                key, index = match.groups()
                val = res.get(key, {}) or []
                assert type(val) == list, f'Cannot set key {key} as of type list as i
    t was earlier marked as {type(val)}'
                while len(val) <= int(index):
                    val.append({})
                val[index] = parse_dotted_str(rest, {})
                res[key] = val
            else:
                # Dict
                res[key] = parse_dotted_str(rest, res.get(key, {}))
        elif '->' in s:
            key, val = s.split('->')
            res[key.strip()] = val.strip()
    
        return res                                                
    

    示例输入和输出

    lines = """
    my.dictionary.value -> value
    my.dictionary.list[0].value -> value
    my.dictionary.list[1].value.list[0].value -> value
    """
    
    res = parse_dotted_strlines(lines)
    print (json.dumps(res, indent=4))
    {
        "my": {
            "dictionary": {
                "value": "value",
                "list": [
                    {
                        "value": "value"
                    },
                    {
                        "value": {
                            "list": [
                                {
                                    "value": "value"
                                }
                            ]
                        }
                    }
                ]
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      json 包是您所需要的

      import json
      mydict = """{
          "str1": "str",
          "list1": ["list1_str1", "list1_str2"],
          "list2": ["list2_str1", "list2_str2", ["list2_str11", "list_str12"]]
      }"""
      json.loads(mydict)
      >> {'str1': 'str',
       'list1': ['list1_str1', 'list1_str2'],
       'list2': ['list2_str1', 'list2_str2', ['list2_str11', 'list_str12']]}
      

      【讨论】:

      • 你根本没有看我的问题,我不是在问如何转储字符串
      • 是的,但我已经更新了我的答案。我正在做相反的事情:)。这是你需要的吗?
      • 不,我需要加载一个点分隔的字符串,如示例中所述:)
      • @Weizen 您能否提供一个最小的可运行示例及其输入和预期输出?
      • 查看stackoverflow.com/questions/53270227/… 我需要一个类似的解决方案,但问题是该解决方案不适用于 my.dictionary.list[0] -> value
      猜你喜欢
      • 1970-01-01
      • 2019-11-18
      • 2018-04-19
      • 2011-09-08
      • 2021-08-20
      • 2012-08-28
      • 2021-12-18
      • 2020-11-27
      • 2011-12-15
      相关资源
      最近更新 更多