Как добавить данные во вложенный файл JSON в Python

== тесты для ссылочного равенства (независимо от того, являются ли они одним и тем же объектом).

.equals() тесты для равенства значений (независимо от того, являются ли они логически «равными»).

Objects.equals () проверяет наличие null перед вызовом .equals(), поэтому вам не нужно (доступно с JDK7, также доступным в Guava ).

String.contentEquals () сравнивает содержимое String с содержимым любого CharSequence (доступно с Java 1.5).

Следовательно, если вы хотите проверить, имеет ли две строки одно и то же значение, вы, вероятно, захотите использовать Objects.equals().

// These two have the same value
new String("test").equals("test") // --> true 

// ... but they are not the same object
new String("test") == "test" // --> false 

// ... neither are these
new String("test") == new String("test") // --> false 

// ... but these are because literals are interned by 
// the compiler and thus refer to the same object
"test" == "test" // --> true 

// ... string literals are concatenated by the compiler
// and the results are interned.
"test" == "te" + "st" // --> true

// ... but you should really just call Objects.equals()
Objects.equals("test", new String("test")) // --> true
Objects.equals(null, "test") // --> false
Objects.equals(null, null) // --> true

Вы почти всегда хотите использовать Objects.equals(). В редкой ситуации, когда вы знаете, что имеете дело с интернированными строками, вы можете использовать ==.

Из JLS 3.10. 5. Строковые литералы :

Кроме того, строковый литерал всегда ссылается на тот же экземпляр класса String. Это связано с тем, что строковые литералы, или, в более общем смысле, строки, которые являются значениями константных выражений ( §15.28 ), «интернированы», чтобы обмениваться уникальными экземплярами, используя метод String.intern.

. Подобные примеры также можно найти в JLS 3.10.5-1 .

1
задан Vollek 17 January 2019 в 10:19
поделиться

2 ответа

Это невозможно с чистым JSON, добавление в список JSON всегда потребует чтения всего файла в память.

Но вы можете использовать JSON Lines для этого. Это формат, где каждая строка в допустимом JSON сама по себе, это то, что AWS использует для своих API. Ваш vegetables.json может быть записан так:

{"cucumber":"green"}
{"tomato":"red"}
{"lettuce":"green"}

Поэтому добавить новую запись очень легко, потому что она становится просто добавлением новой записи в конец файла.

0
ответ дан Cesar Canassa 17 January 2019 в 10:19
поделиться

Поскольку файл будет содержать много информации, загрузка всей памяти файла, добавление информации и запись всего файла обратно в файловую систему - как указано в некоторых ответах - окажется проблематичной

Если ваш файл действительно слишком большой, чтобы поместиться в памяти, то либо исходный json должен был быть разбит на более мелкие независимые части, либо это просто неправильный вариант использования json. То, что у вас есть в данном случае, является проблемой дизайна, а не проблемой кодирования.

Существует по крайней мере один потоковый анализатор json , который может или нет позволить вам решить проблему, в зависимости от структуры исходных данных и эффективных обновлений, которые вы должны сделать. [114 ]

При этом на современных компьютерах вам нужен действительно огромный json-файл, чтобы в конечном итоге съесть все ваши оперативные памяти, поэтому прежде всего вам следует просто проверить эффективный размер файла и объем памяти, который необходимо проанализировать для Python.

0
ответ дан bruno desthuilliers 17 January 2019 в 10:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: