Как сохранить ту же структуру при чтении, изменении и обратной записи в файл JSON? - PullRequest
0 голосов
/ 23 октября 2019

Я сейчас читаю в файле JSON, добавляю ключ и записываю его обратно в тот же файл, используя эту процедуру

with open('data.json', 'r+') as f:
    data = json.load(f)
    temp_key={"test":"val"}
    data["test"]["new_key"] = temp_key
    f.seek(0)        # <--- should reset file position to the beginning.
    json.dump(data, f, indent=2)
    f.truncate()     # remove remaining part

(взято из здесь )

но проблема в том, что он не поддерживает порядок. например, если я читаю:

{
  "test": {
    "something": "something_else"
  },
  "abc": {
    "what": "huh"
  }
}

, вывод получается как:

{
  "abc": {
    "what": "huh"
  },
  "test": {
    "something": "something_else",
    "new_key": {
      "test": "val"
    }
  }
}

Когда я бы хотел, чтобы это было:

{
  "test": {
    "something": "something_else",
    "new_key": {
      "test": "val"
    }
  },
  "abc": {
    "what": "huh"
  }
}

Я понимаю,что JSON является структурой, основанной на ключе / значении, и порядок не имеет значения, но есть ли способ внести изменения и сохранить исходную структуру?

1 Ответ

1 голос
/ 24 октября 2019

Как я уже сказал в комментарии, вы можете использовать collections.OrderedDict вместе с необязательным аргументом ключевого слова object_pairs_hook, принятым json.load() (в Python 2.7) для сохраненияпорядок исходных данных при перезаписи файла.

Вот что я имел в виду:

#!/usr/bin/env python2
from collections import OrderedDict
import json


with open('ordered_data.json', 'r+') as f:
    data = json.load(f, object_pairs_hook=OrderedDict)
    temp_key = {"test": "val"}
    data["test"]["new_key"] = temp_key
    f.seek(0)  # Reset file position to the beginning.
    json.dump(data, f, indent=2)
    f.truncate()  # Remove remaining part.
...