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


Фотография

JSON to Lua


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 11

#1 Оффлайн   Alex

Alex
  • Администраторы
  • Сообщений: 3 785
  • Уровень сигнала: 46,38%
  • В игре: 398 час. 9 мин.

Награды

                 

Отправлено 11 Март 2017 - 10:57

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

 

Так как, решив сэкономить на запросах и не дергать скрипты лишний раз, да и вообще удобно 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шт. гибридочки.

 

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


  • Ex161 это нравится

#2 Оффлайн   YuRaNnNzZZ

YuRaNnNzZZ
  • Пользователи
  • Сообщений: 70
  • Уровень сигнала: 0,05%
  • В игре: 0 час. 28 мин.

Отправлено 11 Март 2017 - 11:24

http://regex.info/blog/lua/json

#3 Оффлайн   Fingercomp

Fingercomp
  • Гуру
  • Сообщений: 2 015
  • Уровень сигнала: 149,05%
  • В игре: 1279 час. 35 мин.

Награды

                                               

Отправлено 11 Март 2017 - 11:58

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



#4 Оффлайн   Alex

Alex
  • Автор темы
  • Администраторы
  • Сообщений: 3 785
  • Уровень сигнала: 46,38%
  • В игре: 398 час. 9 мин.

Награды

                 

Отправлено 11 Март 2017 - 12:04

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

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

 

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



#5 Оффлайн   Totoro

Totoro
  • Хранители Кода
  • Сообщений: 1 750
  • Уровень сигнала: 0,26%
  • В игре: 2 час. 13 мин.

Награды

                                      

Отправлено 11 Март 2017 - 13:10

Мой вариант: 

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



#6 Онлайн   eu_tomat

eu_tomat
  • Хранители Кода
  • Сообщений: 935
  • Уровень сигнала: 5,93%
  • В игре: 50 час. 55 мин.

Награды

                          

Отправлено 11 Март 2017 - 15:29

Немного опасный, но простой код.
> 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: 11 Март 2017 - 15:34

  • Alex, Totoro и Doob это нравится

#7 Оффлайн   Ingr

Ingr
  • Пользователи
  • Сообщений: 188
  • Уровень сигнала: 37,57%
  • В игре: 322 час. 32 мин.
  • ГородМинск

Награды

     

Отправлено 11 Март 2017 - 16:05

1


Сообщение отредактировал Ingr: 11 Март 2017 - 16:07


#8 Оффлайн   Alex

Alex
  • Автор темы
  • Администраторы
  • Сообщений: 3 785
  • Уровень сигнала: 46,38%
  • В игре: 398 час. 9 мин.

Награды

                 

Отправлено 11 Март 2017 - 16:40

Мой вариант

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



#9 Оффлайн   Ingr

Ingr
  • Пользователи
  • Сообщений: 188
  • Уровень сигнала: 37,57%
  • В игре: 322 час. 32 мин.
  • ГородМинск

Награды

     

Отправлено 11 Март 2017 - 17:37

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

 

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

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 нуб.



#10 Оффлайн   Alex

Alex
  • Автор темы
  • Администраторы
  • Сообщений: 3 785
  • Уровень сигнала: 46,38%
  • В игре: 398 час. 9 мин.

Награды

                 

Отправлено 11 Март 2017 - 18:34

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

 

product.id  = '2'

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

и т.д.

 

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

или нет?



#11 Оффлайн   Ingr

Ingr
  • Пользователи
  • Сообщений: 188
  • Уровень сигнала: 37,57%
  • В игре: 322 час. 32 мин.
  • ГородМинск

Награды

     

Отправлено 11 Март 2017 - 18:38

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

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

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

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



#12 Оффлайн   Alex

Alex
  • Автор темы
  • Администраторы
  • Сообщений: 3 785
  • Уровень сигнала: 46,38%
  • В игре: 398 час. 9 мин.

Награды

                 

Отправлено 11 Март 2017 - 18:49

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

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






Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных