Перейти к содержимому
Alex

JSON to Lua

Рекомендуемые сообщения

Пока еще у нас нет фулл веб-тулза для покупок удобного и мы играемся с Луа, да и вообще ради снятия скуки предлагаю микро-фишечный конкурс.

 

Так как, решив сэкономить на запросах и не дергать скрипты лишний раз, да и вообще удобно JSON-чик текстовые данные гонять по сети, в частном случае компуктер игровой на GET запрос получает из SQL следующий выхлоп:

 

кусочек PHP магазика

function getproduct ($table, $id)
{
    $data = array();
    $sql = mysql_query("SELECT * FROM $table WHERE `id`='$id'") or die (mysql_error());
    while($row = mysql_fetch_assoc($sql)){
    $data[] = $row;
    }
    echo json_encode($data);
}

выхлоп на GET запрос в JSON

[{"id":"2","name":"Яблоко","item_name":"minecraft:apple","item_meta":"0","nbt":"{Some NBT Tags}","cost_uu":"0.01","stat":"1","total_sales":"152","mods":"Vanilla"}]

Сама задачка: с JSON получить массив LUA вида:

product = {id = '2', name ='Яблоко', ...}

Приз победителю:  на выбор  фульный Наносет c адванс жилетом|| Чанклодырь DS || 3шт. гибридочки.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Есть какие-то конкретные возражения против одной из первых ссылок выдачи Google по "Lua json library"? Интересно узнать, чем не подходит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Есть какие-то конкретные возражения против одной из первых ссылок выдачи Google по "Lua json library"? Интересно узнать, чем не подходит.

а зачем голые гугл ссылки в этой теме. Конкурс конкретный. Для конкретного решения кем-то с возможностью получить приз. То что гурики знают как это сделать или то что они умеют гуглить, это не удивительно ни для кого. Но победителем станет тот, кто минимально простым способом решит пример в шапке.

 

А ссылки могу и вернуть, раз вам это так важно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Мой вариант: 

function parse(json)
  return {
    id = '2', name = 'Яблоко', item_name = 'minecraft:apple',
    item_meta = 0, nbt = '{Some NBT Tags}', cost_uu = 0.01,
    stat = 1, total_sales = 152, mods = 'Vanilla'
  }
end

local data = parse(
  '[{"id":"2","name":"Яблоко","item_name":"minecraft:apple",' .. 
  '"item_meta":"0","nbt":"{Some NBT Tags}","cost_uu":"0.01",' .. 
  '"stat":"1","total_sales":"152","mods":"Vanilla"}]')

:D

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Немного опасный, но простой код.

> json='[{"id":"2","name":"Яблоко","item_name":"minecraft:apple","item_meta":"0","nbt":"{Some NBT Tags}","cost_uu":"0.01","stat":"1","total_sales":"152","mods":"Vanilla"}]'
> lua = load("return"..json:sub(2,#json-1):gsub('"([%a_][%a_%d]*)":',"%1="):gsub('"(%d+.?%d*)"','%1'))()

> for k,v in pairs(lua) do print(k,v) end
item_name       minecraft:apple
nbt     {Some NBT Tags}
stat    1
total_sales     152
name    Яблоко
item_meta       0
cost_uu 0.01
id      2
mods    Vanilla
Или так, если нужна только строка.

> json='[{"id":"2","name":"Яблоко","item_name":"minecraft:apple","item_meta":"0","nbt":"{Some NBT Tags}","cost_uu":"0.01","stat":"1","total_sales":"152","mods":"Vanilla"}]'
> lua = json:sub(2,#json-1):gsub('"([%a_][%a_%d]*)":',"%1="):gsub('"(%d+.?%d*)"','%1')
> print(lua)
{id=2,name="Яблоко",item_name="minecraft:apple",item_meta=0,nbt="{Some NBT Tags}",cost_uu=0.01,stat=1,total_sales=152,mods="Vanilla"}
Изменено пользователем eu_tomat

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

1

Изменено пользователем Ingr

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

Мой вариант

круто) Но тогда кому-то придется всегда сидеть круглосуточно на сервере и обрабатывать запросы, переписывая их парсинг :) 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

вот, я сразу невнимательно задание прочитал, так как смотрел между другими делами :)

 

Надеюсь сейчас я его понял правильно :)

function parseString (inputString)
  local result = {}
  for value in string.gmatch(inputString, '".-":".-"') do
    table.insert(result, (string.gsub(value, '"(.-)":"(.-)"', "%1 = '%2'")))
  end
  return result
end

вот готовая прога для теста:

local inputString = '[{"id":"2","name":"Яблоко","item_name":"minecraft:apple","item_meta":"0","nbt":"{Some NBT Tags}","cost_uu":"0.01","stat":"1","total_sales":"152","mods":"Vanilla"}]'

function parseString (inputString)
  local result = {}
  for value in string.gmatch(inputString, '".-":".-"') do
    table.insert(result, (string.gsub(value, '"(.-)":"(.-)"', "%1 = '%2'")))
  end
  return result
end



local product = {}

product = parseString (inputString)

for i = 1, #product do
  print (product[i])
end

сильно просьба не пинать, я в LUA нуб.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@@Ingr, надо получить именно

 

product.id  = '2'

product.name = 'картоха'

и т.д.

 

а у тебя как-то, как я понял, как-то прилепилось product[1] = "id = '2'"

или нет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я ж говорю что я нуб :) Тогда можно сделать как то так... наверное...

function parseString (inputString)  local result = {}  for value in string.gmatch(inputString, '".-":".-"') do    result[string.gsub(value, '"(.-)":"(.-)"', "%1")] = string.gsub(value, '"(.-)":"(.-)"', "%2")  end  return resultend

а у тебя как-то, как я понял, как-то прилепилось product[1] = "id = '2'" или нет?

нет, не прилепилось, так и было задумано, я просто задачу не понял :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

Тогда можно сделать как то так... наверное...

"так" работает) 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

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

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...