Пишем\читаем JSON

Программист Ruby Организатор конкурсов Даритель Стимкея 2 место Сбитая кодировка Переводчик 2 место
Больше
10 года 8 мес. назад #84329 от strelokhalfer
Пишем\читаем JSON
Автор: game_guy
Версия: 1.1
Переводчик: strelokhalfer
Оригинал: Ссылка

Описание:
Я давно искал, чем можно сереализировать данные в читаемый формат(Маршал сереализирует в бинарный).
Если для записи XML есть хороший скрипт, то скрипт на парсинг XML я не нашел.
Но к счастью, я нашел простой скрипт на чтение\запить в формат JSON!

JSON:
JSON (англ. JavaScript Object Notation) — текстовый формат обмена данными, основанный на JavaScript и обычно используемый именно с этим языком. Как и многие другие текстовые форматы, JSON легко читается людьми. Формат JSON был разработан Дугласом Крокфордом.

Пример:
ВНИМАНИЕ: Спойлер!

Скрипт:
Code:
#=============================================================================== # Чтение\запись JSON # Версия 1.1 # Автор: game_guy # Переведено strelokhalfer для rpg-maker.info и rpgmaker.su #------------------------------------------------------------------------------- # Возможности: # Работает со строками, массивами, хешами, числами, и логическими(true, false). # # Инструкции: # Скрипт полезен скриптерам. Для чтения JSON, вызовите # JSON.decode("строка формата json") # # Для записи в JSON вызовите: # JSON.encode(object) # # Благодарности: # game_guy ~ за написание сего скрипта. #=============================================================================== module JSON TOKEN_NONE = 0; TOKEN_CURLY_OPEN = 1; TOKEN_CURLY_CLOSED = 2; TOKEN_SQUARED_OPEN = 3; TOKEN_SQUARED_CLOSED = 4; TOKEN_COLON = 5; TOKEN_COMMA = 6; TOKEN_STRING = 7; TOKEN_NUMBER = 8; TOKEN_TRUE = 9; TOKEN_FALSE = 10; TOKEN_NULL = 11; @index = 0 @json = "" @length = 0 def self.decode(json) @json = json @index = 0 @length = @json.length return self.parse end def self.encode(obj) if obj.is_a?(Hash) return self.encode_hash(obj) elsif obj.is_a?(Array) return self.encode_array(obj) elsif obj.is_a?(Fixnum) || obj.is_a?(Float) return self.encode_integer(obj) elsif obj.is_a?(String) return self.encode_string(obj) elsif obj.is_a?(TrueClass) || obj.is_a?(FalseClass) return self.encode_bool(obj) elsif obj.is_a?(NilClass) return "null" end return nil end def self.encode_hash(hash) string = "{" hash.each_key {|key| string += "\"#{key}\":" + self.encode(hash[key]).to_s + "," } string[string.size - 1, 1] = "}" return string end def self.encode_array(array) string = "[" array.each {|i| string += self.encode(i).to_s + "," } string[string.size - 1, 1] = "]" return string end def self.encode_string(string) return "\"#{string}\"" end def self.encode_integer(int) return int.to_s end def self.encode_bool(bool) return (bool.is_a?(TrueClass) ? "true" : "false") end def self.next_token(debug = 0) char = @json[@index, 1] @index += 1 case char when '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-' return TOKEN_NUMBER when '{' return TOKEN_CURLY_OPEN when '}' return TOKEN_CURLY_CLOSED when '"' return TOKEN_STRING when ',' return TOKEN_COMMA when '[' return TOKEN_SQUARED_OPEN when ']' return TOKEN_SQUARED_CLOSED when ':' return TOKEN_COLON end @index -= 1 if @json[@index, 5] == "false" @index += 5 return TOKEN_FALSE elsif @json[@index, 4] == "true" @index += 4 return TOKEN_TRUE elsif @json[@index, 4] == "null" @index += 4 return TOKEN_NULL end return TOKEN_NONE end def self.parse(debug = 0) complete = false while !complete if @index >= @length break end token = self.next_token case token when TOKEN_NONE return nil when TOKEN_NUMBER return self.parse_number when TOKEN_CURLY_OPEN return self.parse_object when TOKEN_STRING return self.parse_string when TOKEN_SQUARED_OPEN return self.parse_array when TOKEN_TRUE return true when TOKEN_FALSE return false when TOKEN_NULL return nil end end end def self.parse_object obj = {} complete = false while !complete token = self.next_token if token == TOKEN_CURLY_CLOSED complete = true break elsif token == TOKEN_NONE return nil elsif token == TOKEN_COMMA else name = self.parse_string return nil if name == nil token = self.next_token return nil if token != TOKEN_COLON value = self.parse obj[name] = value end end return obj end def self.parse_string complete = false string = "" while !complete break if @index >= @length char = @json[@index, 1] @index += 1 case char when '"' complete = true break else string += char.to_s end end if !complete return nil end return string end def self.parse_number @index -= 1 negative = @json[@index, 1] == "-" ? true : false string = "" complete = false while !complete break if @index >= @length char = @json[@index, 1] @index += 1 case char when "{", "}", ":", ",", "[", "]" @index -= 1 complete = true break when "0", "1", "2", '3', '4', '5', '6', '7', '8', '9' string += char.to_s end end return string.to_i end def self.parse_array obj = [] complete = false while !complete token = self.next_token(1) if token == TOKEN_SQUARED_CLOSED complete = true break elsif token == TOKEN_NONE return nil elsif token == TOKEN_COMMA else @index -= 1 value = self.parse obj.push(value) end end return obj end end

"Стрелок, что-то ты неочень похож на свой аватар..."(с)

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Оратор Паладин Даритель Стимкея Проект месяца 1 место Проект месяца 2 место Проект месяца 3 место 2 место Готв 2 место За 3 место на конкурсе маппинга
Больше
10 года 8 мес. назад #84330 от Sypherot
Sypherot ответил в теме Пишем\читаем JSON
А можно привести пару-тройку примеров использования скрипта в проекте на мейкере?

Всего хорошего, и спасибо за рыбу

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Программист Ruby Организатор конкурсов Даритель Стимкея 2 место Сбитая кодировка Переводчик 2 место
Больше
10 года 8 мес. назад #84331 от strelokhalfer
strelokhalfer ответил в теме Пишем\читаем JSON
Например, можно сделать расширенную базу данных.

"Стрелок, что-то ты неочень похож на свой аватар..."(с)

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Время создания страницы: 0.090 секунд
Работает на Kunena форум