【问题标题】:Decoding json message inside of string解码字符串中的 json 消息
【发布时间】:2023-01-02 23:45:54
【问题描述】:

我有以下解码功能;

def flatten_data(json_data):
    """
    Arguments:
        json_data (dict): json data
    Returns:
        dict : {a:1, b:2, b_c:1, b_d:2}
    """
    out = {}

    def flatten(x, name=''):
        if type(x) is dict:
            for a in x:
                flatten(x[a], name + a + '_')
        elif type(x) is list:
            out[name[:-1]] = x
        else:
            out[name[:-1]] = x

    flatten(json_data)
    return out

如果我为此函数提供以下 JSON 正文输入;

{
  "id": "123",  
  "name": "Jack",  
  "createdAt": 20221212,  
  "region": '{"country": "USA", "city": "NewYork"}'
}

我需要得到如下输出;

{
  "id": "123",  
  "name": "Jack",  
  "createdAt": 20221212,  
  "region_country": "USA",
  "region_city": 'NewYork'
}

如何修改我的flatten_data 函数?

【问题讨论】:

  • 你是如何阅读 json 数据的?请提供更多信息

标签: python json json-deserialization jsondecoder


【解决方案1】:

因为您在 json_data 中的“区域”键提供了 str 数据而不是 dict,所以您得到了错误的 JSON 值。请尝试使其成为字典。

试试这个数据

 json_data = {
  "id": "123",  
  "name": "Jack",  
  "createdAt": 20221212,  
  "region": {"country": "USA", "city": "NewYork"}
 }

【讨论】:

    【解决方案2】:

    您可以通过对值为 str 的现有代码进行一些修改来执行此操作,因为在这种情况下,地区有报价""。所以要处理这个你可以使用内置的json模块。

    import json
    
    def flatten_data(json_data):
        """
        Arguments:
            json_data (dict): json data
        Returns:
            dict : {a:1, b:2, b_c:1, b_d:2}
        """
        out = {}
    
        def flatten(x, name=''):
            if type(x) is dict:
                for a in x:
                    flatten(x[a], name + a + '_')
            elif type(x) is list:
                out[name[:-1]] = x
            elif type(x) is str:
                try:
                    y = json.loads(x)
                    flatten(y, name)
                except:
                    out[name[:-1]] = x
            else:
                out[name[:-1]] = x
    
        flatten(json_data)
        return out
    
    json_data = {
      "id": "123",  
      "name": "Jack",  
      "createdAt": 20221212,  
      "region": '{"country": "USA", "city": "NewYork"}'
    }
    
    print(flatten_data(json_data))
    

    输出:

    {
      "id": "123",  
      "name": "Jack",  
      "createdAt": 20221212,  
      "region_country": "USA",
      "region_city": 'NewYork'
    }
    

    【讨论】:

      猜你喜欢
      • 2021-05-23
      • 2019-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-15
      • 2013-05-10
      • 1970-01-01
      相关资源
      最近更新 更多