모듈:JSON: 두 판 사이의 차이
백괴게임>Gustmd7410 잔글편집 요약 없음 |
(Hsl0의 254029판 편집을 되돌림) 태그: 편집 취소 |
||
(사용자 3명의 중간 판 61개는 보이지 않습니다) | |||
3번째 줄: | 3번째 줄: | ||
JSON 모듈 | JSON 모듈 | ||
JSON 코드에 있는 값의 내용을 반환하거나, 값을 수정한 JSON 코드를 다시 반환합니다. | JSON 코드에 있는 값의 내용을 반환하거나, 값을 수정한 JSON 코드를 다시 반환합니다. | ||
이 코드는 일단 CC BY-NC-SA로 배포되나, 추후 CC | 이 코드는 일단 CC BY-NC-SA로 배포되나, 추후 CC BY-SA로 변경될 수 있습니다. | ||
한국어 백괴게임의 Gustmd7410이 만들었습니다. | 한국어 백괴게임의 Gustmd7410이 만들었습니다. | ||
]]-- | ]]-- | ||
10번째 줄: | 10번째 줄: | ||
JSON Module | JSON Module | ||
You can get and change JSON code's value with this. | You can get and change JSON code's value with this. | ||
This code is distributed with CC BY-NC-SA license, but it | This code is distributed with CC BY-NC-SA license, but it could be changed into CC BY-SA license later. | ||
Made by Gustmd7410 in Korean Ungame. | Made by Gustmd7410 in Korean Ungame. | ||
]]-- | ]]-- | ||
local args = | local a = {} | ||
local b = setmetatable({ | |||
rtyp = a.typ, | |||
typ = false | |||
}, { | |||
__index = a | |||
}) | |||
local p = setmetatable({}, { | |||
__index = function(t, key) | |||
return b[key] and function(frame) | |||
local args = getRawArgs(frame.args) | |||
local data = mw.text.jsonDecode(table.remove(args, 1)) | |||
local value = b[key](data, args) | |||
if type(value) == "table" | |||
then return mw.text.jsonEncode(value) | |||
else return value | |||
end | |||
end or nil | |||
end | |||
}) | |||
function getRawArgs(args) | |||
local raw = {} | |||
for key, value in pairs(args) do | |||
raw[key] = value | |||
end | |||
return raw | |||
end | |||
function settype(value) | |||
if value:find('^("+)(.*)%1$') and pcall(mw.text.jsonDecode, value:gsub('^("+)(.*)%1$', "%2")) then | |||
return value:gsub('^"(("+)(.*)%2)"$', "%1") | |||
elseif pcall(mw.text.jsonDecode, value) then return mw.text.jsonDecode(value) | |||
elseif value == "" then return nil | |||
else return value | |||
end | |||
end | |||
function p.typ(frame) | |||
local key = frame.args[2] | |||
key = tonumber(key) or key | |||
local value = mw.text.jsonDecode(frame.args[1])[key] | |||
if value == null then return "null" end | |||
return type(value) | |||
end | |||
function a.typ(data) | |||
return type(data) | |||
end | |||
function a.get(data, args) | |||
for depth, key in pairs(args) do | |||
key = tonumber(key) or key | |||
data = data[key] | |||
end | |||
return data | |||
end | |||
function a.set(data, args) | |||
local key = args[1] | |||
local value = mw.text.trim(args[2]) | |||
key = tonumber(key) or key | |||
data[key] = settype(value) | |||
return data | |||
end | |||
function p.new(frame) | |||
local data = getRawArgs(frame.args) | |||
for key, value in pairs(data) do | |||
data[key] = settype(mw.text.trim(value)) | |||
end | |||
return mw.text.jsonEncode(data) | |||
end | |||
function a.mer(base, args) | |||
for seq in pairs(args) do | |||
local data = mw.text.jsonDecode(args[seq]) | |||
for key in pairs(data) do base[key] = data[key] end | |||
end | |||
return base | |||
end | |||
function a.del(data, args) | |||
for seq, key in pairs(args) do | |||
data[tonumber(key) or key] = nil | |||
end | |||
return data | |||
end | |||
function a.len(data) | |||
return #data | |||
end | |||
function a.con(data, args) | |||
return table.concat(data, args[2] or ',', tonumber(args[3]) or 1, tonumber(args[4]) or #data) | |||
end | |||
function | function a.ins(data, args) | ||
local index = tonumber(args[3]) or #data + 1 | |||
if index < 0 then | |||
index = #data + index | |||
end | |||
table.insert(data, index, args[2]) | |||
return data | |||
end | |||
function a.rem(data, args) | |||
for seq, key in pairs(args) do | |||
key = tonumber(key) | |||
if key < 0 then | |||
key = #data + key | |||
end | |||
table.remove(data, key) | |||
end | |||
return data | |||
end | |||
function a.srt(data, args) | |||
table.sort(data) | |||
return data | |||
end | |||
else return | function p.chk(frame) | ||
if pcall(mw.text.jsonDecode, frame.args[1]) | |||
then return frame.args[2] | |||
else return frame.args[3] | |||
end | end | ||
end | end | ||
function p. | function p.str(frame) | ||
return mw.text.jsonDecode('"' .. frame.args[1] .. '"') | |||
end | |||
function p.pty(frame) | |||
local data = mw.text.jsonDecode(frame.args[1]) | |||
return mw.text.jsonEncode(data, mw.text.JSON_PRETTY) | |||
end | |||
function p.cmd(frame) | |||
local data = mw.text.jsonDecode(frame.args[1]) | local data = mw.text.jsonDecode(frame.args[1]) | ||
local | local commands = mw.text.jsonDecode('[' .. frame.args[2]:sub(1, -2) .. ']') | ||
local pretty = false | |||
for index, command in pairs(commands) do | |||
for action, args in pairs(command) do | |||
if action == 'pty' then | |||
pretty = true | |||
else | |||
data = a[action](data, args) | |||
end | |||
break | |||
end | |||
end | |||
local | if type(data) == "table" then | ||
return pretty and mw.text.jsonEncode(data, mw.text.JSON_PRETTY) or mw.text.jsonEncode(data) | |||
else | |||
return data | |||
end | |||
end | |||
function a.has(data, args) | |||
local valt = {} | |||
local result = nil | |||
for key, value in pairs(data) do | |||
valt[value] = true | |||
end | |||
for index, value in pairs(args) do | |||
if result == nil then result = true end | |||
if valt[value] ~= true then result = false end | |||
end | |||
return | return result | ||
end | end | ||
function | a['for'] = function(data, args) | ||
local | local text = '' | ||
local keyv = args.key or 'key' | |||
local valv = args.value or 'value' | |||
local func = require('모듈:TemplateFunction').new(args[1]) | |||
for key, value in pairs(data) do | |||
if type(value) == "table" then | |||
value = mw.text.jsonEncode(value) | |||
end | |||
text = text .. func{ | |||
[keyv] = key, | |||
[valv] = value | |||
} | |||
end | |||
return text | |||
end | |||
function a.map(data, args) | |||
local keyv = args.key or 'key' | |||
local valv = args.value or 'value' | |||
local func = require('모듈:TemplateFunction').new(args[1]) | |||
data[key] = settype(value) | for key, value in pairs(data) do | ||
if type(value) == "table" then | |||
value = mw.text.jsonEncode(value) | |||
end | |||
data[key] = settype(func{ | |||
[keyv] = key, | |||
[valv] = value | |||
}) | |||
end | |||
return | return data | ||
end | end | ||
function | function a.red(data, args) | ||
local val = '' | |||
local keyv = args.key or 'key' | |||
local valv = args.value or 'value' | |||
local prev = args.returned or '1' | |||
local func = require('모듈:TemplateFunction').new(args[1]) | |||
for key, value in pairs(data) do | |||
if type(value) == "table" then | |||
value = mw.text.jsonEncode(value) | |||
end | |||
val = func{ | |||
[keyv] = key, | |||
[valv] = value, | |||
[prev] = val | |||
} | |||
end | |||
return val | |||
end | |||
function p.spl(frame) | |||
local text = frame.args[1] | |||
local sep = frame.args[2] | |||
return mw.text.jsonEncode( | return mw.text.jsonEncode(mw.text.split(text, sep)) | ||
end | end | ||
return p | return p |
2024년 6월 13일 (목) 18:16 기준 최신판
JSON 데이터를 읽어들여 값을 반환하거나, 데이터를 수정합니다.
주의사항[원본 편집]
이 모듈은 null
을 없는 값으로 간주합니다. 따라서 null 값을 보존하려면 이 모듈을 사용하지 말것을 권장합니다.
사용전:
{"var1": true, "var2": null, "var3": false}
사용후:
{"var1": true, "var3": false}
루아에서는 배열의 순서가 1부터 시작합니다. 이 점 유의해 주세요.
["aaa", "bbb", "ccc", "ddd"]
JS | 값 | Lua |
---|---|---|
0 | aaa | 1 |
1 | bbb | 2 |
2 | ccc | 3 |
3 | ddd | 4 |
객체의 경우 속성이 표시되는 순서가 바뀔 수 있습니다. 단, 배열은 해당되지 않으며 객체의 순서가 바뀌어도 속성명은 변하지 않으므로 변수를 호출할 때에 큰 문제는 없습니다.
사용전:
{"var1": "aaaa", "var2": 1234, "var3": true}
[1, 3, 5, 9]
사용후:
{"var2":1234,"var3":true,"var1":"aaaa"}
[1,3,5,9]
사용법[원본 편집]
변수[원본 편집]
객체를 사용한다면 속성명을 그대로 입력하시면 됩니다.
JSON에서는 문자열, 숫자, 부울, 배열, 객체, null을 다루며, 이 틀에서 값을 입력할 때 기본적으로는 문자열으로 처리되지만, JSON 값의 형식에 맞춰서 입력한다면 자동으로 타입이 적용됩니다. 만약 강제적으로 문자열을 적용하고 싶다면 ""
로 이스케이프하실 수 있습니다. 만약, 이스케이프된 문자열을 ""로 묶고 싶으시다면 그 안에
""를 더 넣으실 수 있습니다. (예시: "true"
→true
, ""123""
→"123"
)
칸을 비우시면 없는 값으로 간주되어 내용이 삭제됩니다. 만약, 빈 문자열을 사용하고 싶으시다면 ""
을 입력하세요. 칸을 비우기 곤란하시다면 null
을 사용하여 내용을 지우실 수 있습니다. null 역시 마찬가지로 "null"
과 같이 이스케이프가 가능합니다.
JSON 코드[원본 편집]
조작할 JSON 데이터를 특정합니다. 상황에 따라 다음 중 한가지 방법대로 두번째 변수(JSON 코드)에 입력해 주세요.
- JSON 코드 직접 입력
- JSON 코드가 반환되는 이 모듈도 사용하실 수 있습니다.
- JSON 문서 불러오기
- JSON 문서를 불러와서 입력하시려면 다음과 같이 틀의 형태로 입력해 주세요.
{{사용자:홍길동/데이터.json}} {{:한게임/DB}}
- 빈 JSON 코드
- 비어있는 JSON 코드를 사용하시려면
{}
나[]
만 입력해 주세요.
새로 만들기[원본 편집]
{{#switch:}}문법과 비슷하게 JSON 데이터를 새로 만들 수 있습니다.
{{#invoke:JSON|new|(값1)|(변수a)=(값a)|...}}
변수를 지정하지 않은 경우 변수는 틀과 같이 순서로 지정이 되며, 배열을 만들고자 할 경우 변수 없이 값만 입력하시면 됩니다.
이 기능은 앞서 말했다시피 #switch 문법과 유사하기 때문에 호환이 될 수 있습니다. 앞부분의 {{#switch:{{{1}}}
부분을 한번 {{풀기:#invoke:JSON|new
로 변경해 보세요. switch가 JSON으로 마법같이 변신할겁니다.
{{#switch:{{{1}}} |var1=aaaa |var2=1234 |var3=true }}
{{풀기:#invoke:JSON|new |var1=aaaa |var2=1234 |var3=true }}
{
"var2": 1234,
"var3": true,
"var1": "aaaa"
}
어때요, 신기하지 않나요? 이 기능과 함께 switch에서 JSON으로 갈아타세요!
다른 방법으로, 일반 문자열을 콤마(,) 등을 기준으로 나눠서 배열을 만들 수 있습니다.
{{#invoke:JSON|spl|(문자열)|(구분자)}}
구분자를 비우거나 입력하지 않으면 기본적으로 글자 하나하나씩 나눕니다.
여기서 주의할 점은 구분자는 일반 문자열이 아니라 정규 표현식과 비슷한 패턴으로 입력해야 한다는 겁니다. 루아의 패턴 문법(영문)을 참고해서 입력해 주세요.
변수값 얻기[원본 편집]
JSON 데이터에 있는 변수의 값을 얻으려면 다음과 같이 입력합니다:
{{#invoke:JSON|get|(JSON 코드)|(변수)}}
위와 같이 입력하시면 해당 변수의 값만 그대로 나오며, 값이 없는 경우 기본값이 나옵니다.
예를 들어, var
변수의 값을 얻는다면 이렇게 입력하세요:
{{#invoke:JSON|get|(JSON 코드)|var}}
{{JSON}}을 이용하면 더 간단히 입력하실 수 있습니다. 자세한 내용은 해당 문서를 확인해 주세요.
변수값 변경[원본 편집]
JSON 데이터에 있는 변수의 값을 변경하려면 다음과 같이 입력합니다:
{{#invoke:JSON|set|(JSON 코드)|(변수)|(값)}}
위와 같이 입력하시면 해당 변수의 값이 변경된 JSON 코드가 반환됩니다.
예를 들어, var
변수의 값을 2
로 변경할 경우 이렇게 입력하세요:
{{#invoke:JSON|set|(JSON 코드)|var|2}}
JSON 데이터에 없는 변수를 추가할때도 마찬가지로 똑같이 입력하시면 됩니다.
변수의 값을 비워두거나 null로 설정하면 변수가 제거됩니다.
코드 합치기[원본 편집]
두 JSON 코드를 합칩니다. new랑 궁합이 매우 좋습니다.
{{#invoke:JSON|mer|(JSON 코드1)|(JSON 코드2)|...}}
만약 중복된 항목이 있으면 2번 코드의 값으로 설정됩니다.
이를 응용하여 내용 수정에도 사용하실 수 있습니다. 만약 var1
의 값을 2
로 바꾸고 var2
의 값을 false
로 바꾸려는 경우 다음과 같이 입력해 주세요. 다만 new는 값을 제거하는 데에는 이용하실 수 없으며 JSON 코드를 직접 입력하셔야 합니다.
{{#invoke:JSON|mer|(JSON 코드)|{{#invoke:JSON|new|var1=2|var2=false}}}}
변수 제거[원본 편집]
여러개의 변수를 일괄적으로 제거합니다.
{{#invoke:JSON|del|(JSON 코드)|(변수1)|(변수2)|...}}
작업 조합[원본 편집]
만약 여러 작업을 동시에 하고 싶다면 cmd명령을 사용해 CGI2 방식으로 명령어를 입력하거나, 모듈:JSON/cmd를 사용하실 수 있습니다. 모듈:JSON/cmd는 JSON 코드 부분을 생략합니다.
{{#invoke:JSON|cmd |{{#invoke:JSON|new|var=true}} |{{#invoke:JSON/cmd|mer| {{#invoke:JSON|new |var1=5 |var2={{#invoke:JSON|new|ㅁㄴㅇㄹ}} }} }} {{#invoke:JSON/cmd|del|var}} {{#invoke:JSON/cmd|get|var1}} }}
도보시오[원본 편집]
위 설명은 모듈:JSON/설명문서의 내용을 가져와 보여주고 있습니다. (편집 | 역사) 이 모듈에 대한 수정 연습과 시험은 연습장 (만들기 | 미러)과 시험장 (만들기)에서 할 수 있습니다. 분류는 /설명문서에 넣어주세요. 이 모듈에 딸린 문서. |
--[[
ko:
JSON 모듈
JSON 코드에 있는 값의 내용을 반환하거나, 값을 수정한 JSON 코드를 다시 반환합니다.
이 코드는 일단 CC BY-NC-SA로 배포되나, 추후 CC BY-SA로 변경될 수 있습니다.
한국어 백괴게임의 Gustmd7410이 만들었습니다.
]]--
--[[
en:
JSON Module
You can get and change JSON code's value with this.
This code is distributed with CC BY-NC-SA license, but it could be changed into CC BY-SA license later.
Made by Gustmd7410 in Korean Ungame.
]]--
local a = {}
local b = setmetatable({
rtyp = a.typ,
typ = false
}, {
__index = a
})
local p = setmetatable({}, {
__index = function(t, key)
return b[key] and function(frame)
local args = getRawArgs(frame.args)
local data = mw.text.jsonDecode(table.remove(args, 1))
local value = b[key](data, args)
if type(value) == "table"
then return mw.text.jsonEncode(value)
else return value
end
end or nil
end
})
function getRawArgs(args)
local raw = {}
for key, value in pairs(args) do
raw[key] = value
end
return raw
end
function settype(value)
if value:find('^("+)(.*)%1$') and pcall(mw.text.jsonDecode, value:gsub('^("+)(.*)%1$', "%2")) then
return value:gsub('^"(("+)(.*)%2)"$', "%1")
elseif pcall(mw.text.jsonDecode, value) then return mw.text.jsonDecode(value)
elseif value == "" then return nil
else return value
end
end
function p.typ(frame)
local key = frame.args[2]
key = tonumber(key) or key
local value = mw.text.jsonDecode(frame.args[1])[key]
if value == null then return "null" end
return type(value)
end
function a.typ(data)
return type(data)
end
function a.get(data, args)
for depth, key in pairs(args) do
key = tonumber(key) or key
data = data[key]
end
return data
end
function a.set(data, args)
local key = args[1]
local value = mw.text.trim(args[2])
key = tonumber(key) or key
data[key] = settype(value)
return data
end
function p.new(frame)
local data = getRawArgs(frame.args)
for key, value in pairs(data) do
data[key] = settype(mw.text.trim(value))
end
return mw.text.jsonEncode(data)
end
function a.mer(base, args)
for seq in pairs(args) do
local data = mw.text.jsonDecode(args[seq])
for key in pairs(data) do base[key] = data[key] end
end
return base
end
function a.del(data, args)
for seq, key in pairs(args) do
data[tonumber(key) or key] = nil
end
return data
end
function a.len(data)
return #data
end
function a.con(data, args)
return table.concat(data, args[2] or ',', tonumber(args[3]) or 1, tonumber(args[4]) or #data)
end
function a.ins(data, args)
local index = tonumber(args[3]) or #data + 1
if index < 0 then
index = #data + index
end
table.insert(data, index, args[2])
return data
end
function a.rem(data, args)
for seq, key in pairs(args) do
key = tonumber(key)
if key < 0 then
key = #data + key
end
table.remove(data, key)
end
return data
end
function a.srt(data, args)
table.sort(data)
return data
end
function p.chk(frame)
if pcall(mw.text.jsonDecode, frame.args[1])
then return frame.args[2]
else return frame.args[3]
end
end
function p.str(frame)
return mw.text.jsonDecode('"' .. frame.args[1] .. '"')
end
function p.pty(frame)
local data = mw.text.jsonDecode(frame.args[1])
return mw.text.jsonEncode(data, mw.text.JSON_PRETTY)
end
function p.cmd(frame)
local data = mw.text.jsonDecode(frame.args[1])
local commands = mw.text.jsonDecode('[' .. frame.args[2]:sub(1, -2) .. ']')
local pretty = false
for index, command in pairs(commands) do
for action, args in pairs(command) do
if action == 'pty' then
pretty = true
else
data = a[action](data, args)
end
break
end
end
if type(data) == "table" then
return pretty and mw.text.jsonEncode(data, mw.text.JSON_PRETTY) or mw.text.jsonEncode(data)
else
return data
end
end
function a.has(data, args)
local valt = {}
local result = nil
for key, value in pairs(data) do
valt[value] = true
end
for index, value in pairs(args) do
if result == nil then result = true end
if valt[value] ~= true then result = false end
end
return result
end
a['for'] = function(data, args)
local text = ''
local keyv = args.key or 'key'
local valv = args.value or 'value'
local func = require('모듈:TemplateFunction').new(args[1])
for key, value in pairs(data) do
if type(value) == "table" then
value = mw.text.jsonEncode(value)
end
text = text .. func{
[keyv] = key,
[valv] = value
}
end
return text
end
function a.map(data, args)
local keyv = args.key or 'key'
local valv = args.value or 'value'
local func = require('모듈:TemplateFunction').new(args[1])
for key, value in pairs(data) do
if type(value) == "table" then
value = mw.text.jsonEncode(value)
end
data[key] = settype(func{
[keyv] = key,
[valv] = value
})
end
return data
end
function a.red(data, args)
local val = ''
local keyv = args.key or 'key'
local valv = args.value or 'value'
local prev = args.returned or '1'
local func = require('모듈:TemplateFunction').new(args[1])
for key, value in pairs(data) do
if type(value) == "table" then
value = mw.text.jsonEncode(value)
end
val = func{
[keyv] = key,
[valv] = value,
[prev] = val
}
end
return val
end
function p.spl(frame)
local text = frame.args[1]
local sep = frame.args[2]
return mw.text.jsonEncode(mw.text.split(text, sep))
end
return p