Как писать файл sounds json
Перейти к содержимому

Как писать файл sounds json

  • автор:

Звуки#

* category — указывает на то, какая категория будет у данного звука, т.е. если мы указали player , то в игре, в настройках звука мы сможем отключить свой звук передвинув ползунок Игроки . Категории звуков в игре: — master — общие звуки — music — музыка — record — пластинка — weather — погода — block — блоки — hostile — враждебные сущности — neutral — нейтральные или дружелюбные(как написано в игре) — player — игроки — ambient — окружение — voice — голос/речь * sounds — массив звуковых файлов, который будет поочерёдно проигрываться. — name — название звука без формата — volume — громкость. Чем выше значение, тем дальше будет слышимость — pitch — высота звука. Если 1.0, то звук будет нормально проигрываться, если же ниже, то звук будет иметь эффект замедления — weight — шанс воспроизведения звука — stream — имеет два положения true/false , при true проигрывается звук из файла. Это нужно, чтобы избежать проблем со звучанием звука в игре, т.е. если ваш звук более одной минуты, то рекомендуется выставить данный параметр на true .

 "test_sound":  "category": "player", "sounds": [  "name": "*modid*:myTestSound", "stream": true >,  "name": "*modid*:myTestSound2", "pitch": 0.2, "weight": 2.0 > ] >, "nextSound":  "sounds": ["*modid*:nextSound"] > > 

Создадим класс Sounds .

public class Sounds  //Это наш звук, `test_sound` это название звука указанного в sounds.json public static final SoundEvent test = registry("test_sound"); @SubscribeEvent public void registerSounds(RegistryEvent.RegisterSoundEvent> e)  //Регистрация звука ForgeRegistries.SOUND_EVENTS.register(test); > //Упрощённая регистрация звука private SoundEvent registry(String name)  ResourceLocation uniqueName = new ResourceLocation(*modid*, name); return new SoundEvent(uniqueName).setRegistryName(uniqueName); > > 

*modid* — это modId мода

Чтобы воспроизвести наш звук, добавим такой код:

/** * blockPos - это позиция на которой будет проигрываться звук * Sounds.test - это наш звук из ранее созданного класса Sounds * SoundCategory.PLAYERS - категория звука * 1.0 - громкость * 1.0 - высота * false - задержка */ world.playSound(blockPos, Sounds.test, SoundCategory.PLAYERS, 1.0F, 1.0F, false) 

Затем зарегистрируем Sounds класс в MinecraftForge.EVENT_BUS и зайдём в игру!

Как добавить в существующую структуру json(файл) новую запись?

тоесть первый вариант кода должен повторяться. чтобы записать новую запись и не стереть существующие нужно открыть файл очевидно, открываю файл вот так:

with open("music.json", "a+") as file: тут тупик :-D 

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

with open("music.json", "a+") as file: data = json.load(file) data["object"][1] = to_json json.dump(data,file) 

там уже ошибка. подскажите пожалуйста как можно это сделать.
Отслеживать
26.1k 4 4 золотых знака 21 21 серебряный знак 36 36 бронзовых знаков
задан 1 авг 2023 в 7:12
83 11 11 бронзовых знаков

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Это словарь и в нём есть запись с ключом object . Вы не можете в словарь записать ещё один ключ object , ключи словаря не могут повторяться. При чтении такого json будет либо ошибка, либо останется только один из ключей, мне лень проверять.

Вам нужно поменять структуру json , например, поместить всё это ещё и в список, в списке элементы могут повторяться, можно повторять, например, словари:

Ну либо вам нужно добавлять элементы в списки object и song , тогда это нужно делать так:

data["object"].append(new_object) data["song"].append(new_song) 

Ну и да, json нужно читать целиком, модифицировать и потом записывать целиком.

Работа с JSON

Обозначение объектов JavaScript (JSON — JavaScript Object Notation) — стандартный текстовый формат для представления структурированных данных на основе синтаксиса объекта JavaScript. Он обычно используется для передачи данных в веб-приложениях (например, отправка некоторых данных с сервера клиенту,таким образом чтобы это могло отображаться на веб-странице или наоборот). Вы будете сталкиваться с этим довольно часто, поэтому в этой статье мы даём вам все, что вам нужно для работы с JSON используя JavaScript, включая парсинг JSON, чтобы вы могли получить доступ к данным внутри него при создании JSON.

Необходимые знания: Базовая компьютерная грамотность, базовые знания HTML и CSS, знакомство с основами JavaScript (см. First steps и Building blocks) и основами OOJS (see Introduction to objects).
Цель: Понять, как работать с данными, хранящимися в JSON, и создавать свои собственные объекты JSON.

Нет, действительно, что такое JSON?

JSON — текстовый формат данных, следующий за синтаксисом объекта JavaScript, который был популяризирован Дугласом Крокфордом. Несмотря на то, что он очень похож на буквенный синтаксис объекта JavaScript, его можно использовать независимо от JavaScript, и многие среды программирования имеют возможность читать (анализировать) и генерировать JSON.

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

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

Объект JSON может быть сохранён в собственном файле, который в основном представляет собой текстовый файл с расширением .json и MIME type application/json .

Структура JSON

Как описано выше, JSON представляет собой строку, формат которой очень похож на буквенный формат объекта JavaScript. Вы можете включать одни и те же базовые типы данных внутри JSON, так же как и в стандартном объекте JavaScript — строки, числа, массивы, булевы и другие объектные литералы. Это позволяет построить иерархию данных, к примеру, так:

 "squadName": "Super hero squad", "homeTown": "Metro City", "formed": 2016, "secretBase": "Super tower", "active": true, "members": [  "name": "Molecule Man", "age": 29, "secretIdentity": "Dan Jukes", "powers": ["Radiation resistance", "Turning tiny", "Radiation blast"] >,  "name": "Madame Uppercut", "age": 39, "secretIdentity": "Jane Wilson", "powers": [ "Million tonne punch", "Damage resistance", "Superhuman reflexes" ] >,  "name": "Eternal Flame", "age": 1000000, "secretIdentity": "Unknown", "powers": [ "Immortality", "Heat Immunity", "Inferno", "Teleportation", "Interdimensional travel" ] > ] > 

Если бы мы загрузили этот объект в программу JavaScript, создали переменную с названием superHeroes , мы могли бы затем получить доступ к данным внутри неё, используя те же самые точечную и скобочную нотации, которые мы рассмотрели в статье JavaScript object basics. Например:

.homeTown; superHeroes["active"]; 

Чтобы получить доступ к последующим данным по иерархии, вам просто нужно объединить требуемые имена свойств и индексы массивов. Например, чтобы получить доступ к третьей сверхспособности второго героя, указанного в списке участников, вы должны сделать следующее:

["members"][1]["powers"][2]; 
  1. Сначала у нас есть имя переменной — superHeroes .
  2. Внутри мы хотим получить доступ к свойству members , поэтому мы используем [‘members’] .
  3. members содержат массив, заполненный объектами. Мы хотим получить доступ ко второму объекту внутри массива, поэтому мы используем [1] .
  4. Внутри этого объекта мы хотим получить доступ к свойству powers , поэтому мы используем [‘powers’] .
  5. Внутри свойства powers находится массив, содержащий сверхспособности выбранного героя. Нам нужен третий, поэтому мы используем [2] .

Примечание: . Мы сделали JSON, видимый выше, доступным внутри переменной в нашем примере JSONTest.html (см. исходный код). Попробуйте загрузить это, а затем получить доступ к данным внутри переменной через консоль JavaScript вашего браузера.

Массивы как JSON

Выше мы упоминали ,что JSON текст выглядит практически так же как и JavaScript объект,и это почти правильно.Причина,по которой мы говорим почти правильно заключается в том ,что массив также валиден JSON например:

[  "name": "Molecule Man", "age": 29, "secretIdentity": "Dan Jukes", "powers": ["Radiation resistance", "Turning tiny", "Radiation blast"] >,  "name": "Madame Uppercut", "age": 39, "secretIdentity": "Jane Wilson", "powers": [ "Million tonne punch", "Damage resistance", "Superhuman reflexes" ] > ] 

Вышесказанное вполне справедливо для JSON. Вам просто нужно получить доступ к элементам массива (в его анализируемой версии), начиная с индекса массива, например [0][«powers»][0] .

Другие примечания

  • JSON — это чисто формат данных — он содержит только свойства, без методов.
  • JSON требует двойных кавычек, которые будут использоваться вокруг строк и имён свойств. Одиночные кавычки недействительны.
  • Даже одна неуместная запятая или двоеточие могут привести к сбою JSON-файла и не работать. Вы должны быть осторожны, чтобы проверить любые данные, которые вы пытаетесь использовать (хотя сгенерированный компьютером JSON с меньшей вероятностью включает ошибки, если программа генератора работает правильно). Вы можете проверить JSON с помощью приложения вроде JSONLint.
  • JSON может принимать форму любого типа данных, допустимого для включения в JSON, а не только массивов или объектов. Так, например, одна строка или номер будут действительным объектом JSON.
  • В отличие от кода JavaScript, в котором свойства объекта могут не заключаться в двойные кавычки, в JSON в качестве свойств могут использоваться только строки заключённые в двойные кавычки.

Активное обучение: Работа с примером JSON

Итак, давайте рассмотрим пример, чтобы показать то, как мы можем использовать некоторые данные JSON на веб-сайте.

Начало работы

Для начала создайте локальные копии наших файлов heroes.html и style.css. Последний содержит простой CSS для стилизации нашей страницы, в то время как первый содержит очень простой HTML-код сущности:

header>header> section>section> 
var header = document.querySelector("header"); var section = document.querySelector("section"); 

Мы собираемся загрузить его на нашу страницу и использовать некоторые изящные манипуляции DOM, чтобы отобразить их, например:

Получение JSON

Чтобы получить JSON, мы будем использовать API, называемый XMLHttpRequest (часто называемый XHR). Это очень полезный объект JavaScript, который позволяет нам делать сетевые запросы для извлечения ресурсов с сервера через JavaScript (например, изображения, текст, JSON, даже фрагменты HTML), что означает, что мы можем обновлять небольшие разделы контента без необходимости перезагрузки всей страницы. Это привело к более отзывчивым веб-страницам и звучит захватывающе, но, к сожалению, выходит за рамки этой статьи, чтобы изучить это гораздо более подробно.

    Начнём с того, что мы собираемся сохранить URL-адрес JSON, который мы хотим получить в переменной. Добавьте нижеследующий код JavaScript:

var requestURL = "https://mdn.github.io/learning-area/javascript/oojs/json/superheroes.json"; 
var request = new XMLHttpRequest(); 
.open("GET", requestURL); 
  • Метод HTTP, который следует использовать при выполнении сетевого запроса. В этом случае GET самый подходящий, так как мы просто извлекаем некоторые простые данные.
  • URL-адрес для запроса — это URL-адрес файла JSON, который мы сохранили ранее.
.responseType = "json"; request.send(); 
.onload = function ()  var superHeroes = request.response; populateHeader(superHeroes); showHeroes(superHeroes); >; 

Здесь мы сохраняем ответ на наш запрос (доступный в свойстве response ) в переменной superHeroes ; эта переменная теперь будет содержать объект JavaScript, основанный на JSON! Затем мы передаём этот объект двум вызовам функций — первый из них заполнит правильными данными, а второй создаст информационную карту для каждого героя в команде и вставляет её в .

Мы свернули код в обработчик событий, который запускается, когда событие загрузки запускается в объекте запроса (см. onload ) — это связано с тем, что событие загрузки запускается, когда ответ успешно возвращается; поступая таким образом,это гарантия того, что request.response определённо будет доступен, когда мы начнём работу с ним.

Теперь мы извлекли данные JSON и превратили его в объект JavaScript, давайте воспользуемся им, написав две функции, на которые мы ссылались выше. Прежде всего, добавьте следующее определение функции ниже предыдущего кода:

function populateHeader(jsonObj)  var header = document.querySelector("header"); var myH1 = document.createElement("h1"); myH1.textContent = jsonObj["squadName"]; header.appendChild(myH1); var myPara = document.createElement("p"); myPara.textContent = "Hometown: " + jsonObj["homeTown"] + " // Formed: " + jsonObj["formed"]; header.appendChild(myPara); > 

Мы назвали параметр jsonObj , чтобы напомнить себе, что этот объект JavaScript возник из JSON. Здесь мы сначала создаём элемент с createElement() , устанавливаем его textContent равным свойству squadName объекта, а затем добавляем его в заголовок с помощью appendChild() . Затем мы выполняем очень похожую операцию с абзацем: создаём его, устанавливаем его текстовое содержимое и добавляем его в заголовок. Единственное различие заключается в том, что его текст задан, как конкатенированная строка, содержащая как homeTown , так и formed свойства объекта.

Создание информационных карт героя

Затем добавьте следующую функцию внизу кода, которая создаёт и отображает карты супергероев:

function showHeroes(jsonObj)  var section = document.querySelector("section"); var heroes = jsonObj["members"]; for (var i = 0; i  heroes.length; i++)  var myArticle = document.createElement("article"); var myH2 = document.createElement("h2"); var myPara1 = document.createElement("p"); var myPara2 = document.createElement("p"); var myPara3 = document.createElement("p"); var myList = document.createElement("ul"); myH2.textContent = heroes[i].name; myPara1.textContent = "Secret identity: " + heroes[i].secretIdentity; myPara2.textContent = "Age: " + heroes[i].age; myPara3.textContent = "Superpowers:"; var superPowers = heroes[i].powers; for (var j = 0; j  superPowers.length; j++)  var listItem = document.createElement("li"); listItem.textContent = superPowers[j]; myList.appendChild(listItem); > myArticle.appendChild(myH2); myArticle.appendChild(myPara1); myArticle.appendChild(myPara2); myArticle.appendChild(myPara3); myArticle.appendChild(myList); section.appendChild(myArticle); > > 

Для начала сохраним свойство members объекта JavaScript в новой переменной. Этот массив содержит несколько объектов, которые содержат информацию для каждого героя.

Затем мы используем for loop для циклического прохождения каждого объекта в массиве. Для каждого из них мы:

  1. Создаём несколько новых элементов: , , три

    и
    .

  2. Устанавливаем , чтобы содержать name текущего героя.
  3. Заполняем три абзаца своей secretIdentity , age и строкой, в которой говорится: «Суперспособности:», чтобы ввести информацию в список.
  4. Сохраняем свойство powers в другой новой переменной под названием superPowers — где содержится массив, в котором перечислены сверхспособности текущего героя.
  5. Используем другой цикл for , чтобы прокрутить сверхспособности текущего героя , для каждого из них мы создаём элемент
  6. , помещаем в него сверхспособности, а затем помещаем listItem внутри элемента
    ( myList ) с помощью appendChild() .
  7. Последнее, что мы делаем, это добавляем ,

    и
    внутри ( myArticle ), а затем добавляем в . Важное значение имеет порядок, в котором добавляются элементы, так как это порядок, который они будут отображать внутри HTML.

Примечание: . Если вам не удаётся заставить этот пример работать, попробуйте обратиться к нашему исходному коду heroes-finished.html (см. также он работает в режиме live).

Примечание: . Если у вас возникли проблемы после нотации точек / скобок, которые мы используем для доступа к объекту JavaScript, в этом поможет открытие файла superheroes.json на другой вкладке или в текстовом редакторе ,и обращаться к нему каждый раз, когда вам нужен JavaScript. Вы также можете обратиться к нашей статье JavaScript objectbasics чтобы получить дополнительную информацию о нотации точек и скобок.

Преобразование между объектами и текстом

Вышеприведённый пример был прост с точки зрения доступа к объекту JavaScript, потому что мы задали XHR-запрос для прямого преобразования ответа JSON в объект JavaScript, используя:

.responseType = "json"; 

Но иногда нам не так везёт — иногда мы получаем сырую строку JSON и нам нужно преобразовать её в объект самостоятельно. И когда мы хотим отправить объект JavaScript по сети, нам нужно преобразовать его в JSON (строку) перед отправкой. К счастью, эти две проблемы настолько распространены в веб-разработке, что встроенный объект JSON доступен в браузерах, которые содержат следующие два метода:

  • parse() : принимает строку JSON в качестве параметра и возвращает соответствующий объект JavaScript.
  • stringify() : принимает объект, как параметр и возвращает эквивалентную строковую JSON строку.

Вы можете увидеть первый метод в действии в нашем примере heroes-finished-json-parse.html (см. исходный код) — это то же самое, что и в примере, который мы создали ранее, за исключением того, что мы установили XHR для возврата сырого JSON текста, затем используется parse() , чтобы преобразовать его в фактический объект JavaScript. Ключевой фрагмент кода находится здесь:

.open("GET", requestURL); request.responseType = "text"; // now we're getting a string! request.send(); request.onload = function ()  var superHeroesText = request.response; // get the string from the response var superHeroes = JSON.parse(superHeroesText); // convert it to an object populateHeader(superHeroes); showHeroes(superHeroes); >; 

Как вы могли догадаться, stringify() работает обратным образом. Попробуйте ввести следующие строки в консоль JavaScript браузера один за другим, чтобы увидеть его в действии:

var myJSON =  name: "Chris", age: "38" >; myJSON; var myString = JSON.stringify(myJSON); myString; 

Здесь мы создаём объект JavaScript, затем проверяем, что он содержит, а затем преобразуем его в строку JSON, используя stringify() , сохраняя возвращаемое значение в новой переменной, а затем снова проверяем его.

Резюме

В этой статье мы предоставили вам простое руководство по использованию JSON в ваших программах, в том числе о том, как создавать и анализировать JSON, и как получить доступ к данным, заблокированным внутри него. В следующей статье мы рассмотрим объектно-ориентированный JavaScript.

Смотрите также

  • JSON object reference page
  • XMLHttpRequest object reference page
  • Using XMLHttpRequest
  • HTTP request methods
  • Official JSON web site with link to ECMA standard
  • Назад
  • Обзор: Введение в объекты JavaScript
  • Далее

Как записать .mp3 в JSON?

Привет.
Пишу на python, использую стандартную библиотеку JSON.
Мне нужно записать файл .mp3 в JSON, но проблема в том что когда я пытаюсь вызвать json.dumps() , и подать в него такой dict:

Мне выдает ошибку что нельзя записать байты.
Как мне записать .mp3 (Т.Е. байтовое значение) в JSON?

  • Вопрос задан более трёх лет назад
  • 1167 просмотров

1 комментарий

Простой 1 комментарий

мда-с всё, что выше понимания, недостижимо.
Решения вопроса 2

Aetae

Во-первых: не надо так делать.
Во-вторых: кодируйте в base64(или аналоги), json — текстовый формат и raw данные туда пихать нельзя.

Ответ написан более трёх лет назад
Нравится 4 3 комментария

always-prog

Stepan Sidorov @always-prog Автор вопроса
Как мне тогда удобно хранить .mp3?

Aetae

Stepan Sidorov, в папочке отдельно.)

always-prog

Stepan Sidorov @always-prog Автор вопроса
Aetae, Ну по всей видимости придется в папках.

trapwalker

Сергей П @trapwalker Куратор тега Python
Программист, энтузиаст

Хранить mp3 вполне логично в файлах в каталоге проекта.
Если вы по какой-то причине не хотите хранить их россыпью в файловой системе, то можно собрать их в zip-файл без сжатия или в tar-архив. С ними можно работать не распаковывая, открыать и читать файлы внутри.
Ещё есть встроенный модуль shelve — это персистентный key-value storage, который держит свои ключи и значения в одном файле. Доступны чтение и запись бинарных данных по ключу.
Base64 приведёт к тому что объём данных увеличится примерно на четверть (на 25 процентов). Сериализация и десериализация больших файлов в текстовый json будет медленным и неэффективным.

Опишите шире вашу задачу и вам предложат типовое ее решение.

Ответ написан более трёх лет назад

always-prog

Stepan Sidorov @always-prog Автор вопроса

Я решил распихивать по файловой системе, записывая в JSON данные которые мне нужны к звукам.
Моя задача: компактно записать звук, и данные к нему (не имя файла, а описание что за звук.)

trapwalker

Сергей П @trapwalker Куратор тега Python

Stepan Sidorov, У mp3 ормата есть id3-теги. Они вписываются в специальной структуре в начало файла. Есть много разных утилит и библиотек для работы (чтения\записи) этих тегов. Если описание не слишком объемное, то можновоспользоваться этой структурой.

always-prog

Stepan Sidorov @always-prog Автор вопроса

Сергей Паньков, Т.Е. предлагаете: хранить файлы в zip, и описание файлов хранить в id3 тегах?
Да, решение хорошое. Правда я уже сделал по другому, просто в JSON файле сохранял пути к файлам .mp3, и там в JSON уже записывал все что мне нужно.
Спасибо за решение.

trapwalker

Сергей П @trapwalker Куратор тега Python

Stepan Sidorov, да смотря какие бизнес-требования к хранению. Может быть вам надо. чтобы при переносе файлов целостность не страдала, тогда каталоги и id3. Если нужна скорость, то индексные таблицы с метаданными и файлы позади кэша. Если компактность и порядок инсталляции в файловой системе, то архив и id3. Если скорость поиска по метаданным, то БД (sqlite) и файлы.
Слишком мало данных по вашей задаче, а вариантов много.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *