【问题标题】:Serialize coordinates to JSON from Python从 Python 将坐标序列化为 JSON
【发布时间】:2020-10-06 08:50:42
【问题描述】:

我有一个拥有无限世界的游戏,所以我使用块来渲染它。这些块存储在这样的字典中:

chunks = {
    (0,0) : {
        'floor' : 'stuff', 
        'items' : {}
    },
    (1,0) : {
        'floor' : 'more stuff', 
        'items' : {}
    }
}

如您所见,块的坐标存储为元组,wjich 非常方便,但这阻止了我将 dict 序列化为 JSON 文件。

有什么方法可以将每个块的键保存为元组 (x, y) 并将字典转储到 JSON 中?

【问题讨论】:

  • "块的坐标作为dict中的键"你能解释一下吗
  • @komatiraju032 抱歉,我是西班牙人,我的英语不是最好的。每个块都存储在字典中,其坐标作为键。我希望键是一个元组,所以我可以在我的代码中使用 (x, y)
  • 为什么是 JSON?您是保存它还是将其发送到其他应用程序(不是用 python 编写的)?

标签: python json dictionary serialization key


【解决方案1】:

实际上 json 要求您的密钥在字符串中。您可以将您的键转换为字符串并将其存储在 json 中,当您需要取回您的值时,您可以将它们恢复为原始形状。在下面的代码中我尽力解决您的问题

import json
chunks = {
          (0,0) : {
                   'floor' : 'stuff', 
                   'items' : {}
                  },
          (1,0) : {
                   'floor' : 'more stuff', 
                   'items' : {}
                  }
         }

# To store dict into json
chunks = {str(k): v for k,v in chunks.items()}
stored_in_json = json.dumps(chunks)

# Load json and revert it back to the orignal shape
chunks = {eval(k): v for k,v in json.loads(stored_in_json).items()}

【讨论】:

    【解决方案2】:

    我觉得pickle 是你需要的。您可以阅读 JSON here 的区别。在你的情况下,这会给:

    保存

    with open('map.pickle', 'wb') as f:
        pickle.dump(chunks, f)
    

    加载中

    with open('map.pickle', 'rb') as f:
        chunks = pickle.load(f)
    

    它为您提供与您保存的完全相同的字典(以二进制格式)。我认为只有在您计划与其他应用程序共享 JSON 时才有意义,尤其是与非 python 应用程序共享:

    JSON 可互操作并在 Python 生态系统之外广泛使用,而 pickle 是 Python 特有的;

    【讨论】:

      【解决方案3】:

      使用两个辅助方法create_json()create_dict()

      create_json() 方法通过将元组键转换为字符串将字典存储在 json 文件中。

      create_dict() 方法从使用create_json() 方法创建的 json 文件创建字典。

      import json
      
      chunks = {
                (0,0) : {
                         'floor' : 'stuff', 
                         'items' : {}
                        },
                (1,0) : {
                         'floor' : 'more stuff', 
                         'items' : {}
                        }
               }
      
      def create_json(data):
          with open('test.json', 'w') as fw:
              res = {str(k): v for k, v in data.items()}
              json.dump(res, fw)
      
      def create_dcit(json_file):
          with open(json_file) as fp:
              data = json.loads(fp.read())
              return {eval(k): v for k, v in data.items()}
      
      create_json(chunks)
      
      y = create_dcit('test.json')
      

      【讨论】:

        猜你喜欢
        • 2015-06-21
        • 2011-08-19
        • 2017-09-03
        • 2020-03-15
        • 1970-01-01
        • 2017-01-20
        • 2015-07-27
        • 2016-12-08
        • 2016-08-21
        相关资源
        最近更新 更多