Сериализовать координаты в JSON из Python - PullRequest
0 голосов
/ 16 июня 2020

У меня есть игра с бесконечным миром, поэтому я визуализирую ее с помощью кусков. Эти фрагменты хранятся в dict следующим образом:

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

Как видите, координаты фрагмента хранятся в виде кортежа, что очень удобно, но это не позволяет мне сериализовать dict в JSON file.

Есть ли способ сохранить ключ каждого фрагмента в виде кортежа (x, y) и выгрузить dict в JSON?

Ответы [ 3 ]

1 голос
/ 16 июня 2020

На самом деле 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()}
0 голосов
/ 16 июня 2020

Использование двух вспомогательных методов create_json() и create_dict().

create_json() метод сохранить словарь в файле json путем преобразования ключей кортежа в строки.

create_dict() метод создать словарь из файла json, созданного с помощью метода create_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')
0 голосов
/ 16 июня 2020

Мне кажется, рассол - это то, что вам здесь нужно. О разнице с JSON вы можете прочитать здесь . В вашем случае это даст:

Сохранение

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 экосистема, в то время как маринад Python -специфичен;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...