"json-editor"λ μΉλΈλΌμ°μ μμ json λ°μ΄ν°λ₯Ό νΈμ§νλ μλν°μ
λλ€.
ν
μ€νΈ νΈμ§ν΄μ μ¬μ©ν μ μκ±°λ json λ°μ΄ν°λ₯Ό μμ½κ² λ€λ£¨κΈ° μνμ¬ λ§λ€μ΄μ§ νλ‘κ·Έλ¨ μ
λλ€.
μ΄ μλν°λ λ
립μ μΌλ‘ λμνλ©° λ©μλλ₯Ό μ€ννμ¬ μλν°μ κΈ°λ₯μ μ‘°μν μ μμ΅λλ€.
κΆμ₯λλ μ¬μ©νκ²½μ λ€μκ³Ό κ°μ΅λλ€.
- λ°μ€ν¬ν
- ν° νλ©΄μ νλΈλ¦Ώ
μλν°κ° μ΄λ»κ² μ¬μ©λλμ§ λ°λͺ¨λ₯Ό νμΈν΄λ³Ό μ μμ΅λλ€. λ°λͺ¨νμ΄μ§μμ μμλ‘ μλν°λ‘ μ¬μ©ν μ μμ΅λλ€.
λ°λͺ¨λ§ν¬: https://redgoose-dev.github.io/json-editor/
javascriptμ cssλ₯Ό λΆλ¬μμ ν΄λμ€ μΈμ€ν΄μ€λ₯Ό λ§λλ λ°©μμΌλ‘ μμν©λλ€.
import JsonEditor from '@redgoose/json-editor'
import '@redgoose/json-editor/css'
const jsonEditor = new JsonEditor(document.getElementById('target'), {
live: true,
theme: 'system',
edit: 'all',
node: {},
openDepth: 2,
})μ»΄ν¬λνΈλ₯Ό μ¬μ©ν λμ μ¬μ©νλ μ΅μ κ°μ λλ€.
live/ (true,false)
μ΄ κ°μ μ¬μ©νλ©΄ λ°μ΄ν°κ° μ λ°μ΄νΈ λ λλ§λ€updateλ©μλκ° νΈμΆλλ©΄μ μ λ°μ΄νΈ μ΄λ²€νΈλ₯Ό νΈμΆν©λλ€.theme/ (system,light,dark)
λ€ν¬λͺ¨λλ₯Ό μ¬μ©νλμ§μ λν κ°μ λλ€.edit/ (all,value,none)
컨νΈλ‘€ν μ μλ λ²μλ₯Ό μ ν©λλ€.node/ ({},[])
ν΄λμ€λ₯Ό μ΄κΈ°νν λ μ¬μ©νλ λ Έλ λ°μ΄ν° κ°μ λλ€.openDepth/ 0
xλ²μ§Έ λμ€μ λ Έλκ° μ΄λ¦¬λμ§μ λνμ¬ μ ν©λλ€.
μΈμ€ν΄μ€μμ μ¬μ©ν μ μλ λ©μλλ€μ΄λ©° νμν λμ μ μ ν μ¬μ©ν μ μμ΅λλ€. (μλλ©΄ ν΄λμ€ νλ‘ν νμ
μΌλ‘ 미리 νμ₯ν΄λ μ μμ΅λλ€.)
μ¬μ©ν μ μλ κ³΅κ° λ©μλλ€μ λ€μκ³Ό κ°μ΅λλ€.
ps. λ¨Όμ μμ€μ½λλ λ€μκ³Ό κ°μ΄ μ μν©λλ€.
const jsonEditor = new JsonEditor() const node = document.querySelector('.node') // node
object, array λ
Έλμμ μμ λ
Έλλ₯Ό μΆκ°ν©λλ€.
jsonEditor.addNode(node, data, options, useUpdate, useUpdateCount)node: λ°μ΄ν°λ₯Ό μΆκ°ν λ Έλ μ리먼νΈdata: μΆκ°ν λ°μ΄ν°options: μΆκ°μ΅μ useUpdate: λ Έλλ₯Ό μΆκ°νκ³ μ λ°μ΄νΈ λ©μλλ₯Ό μ€νν©λλ€.useUpdateCount: λΆλͺ¨λ Έλ λ°μ΄ν° κ°―μλ₯Ό μ λ°μ΄νΈν©λλ€.
λ€μκ³Ό κ°μ΄ μ¬μ©ν μ μμ΅λλ€.
jsonEditor.addNode(
node,
{ key: '', type: 'string', value: 'metal' },
options,
true,
true
)λ Έλλ₯Ό μμ ν©λλ€.
jsonEditor.removeNode(node, useUpdate)node: λ°μ΄ν°λ₯Ό μΆκ°ν λ Έλ μ리먼νΈuseUpdate: λ Έλλ₯Ό μμ νκ³ μ λ°μ΄νΈ λ©μλλ₯Ό μ€νν©λλ€.
λ€μκ³Ό κ°μ΄ μ¬μ©ν μ μμ΅λλ€.
jsonEditor.removeNode(node, true)λ Έλμ νμ μ λ³κ²½ν©λλ€.
jsonEditor.changeType(node, type, useUpdate)node: νμ μ λ³κ²½ν λ Έλ μ리먼νΈtype: νμ μ μ΄λ¦ (object,array,string,number,boolean,null)useUpdate: λ Έλ νμ μ λ³κ²½νκ³ μ λ°μ΄νΈ λ©μλλ₯Ό μ€νν©λλ€.
λ€μκ³Ό κ°μ΄ μ¬μ©ν μ μμ΅λλ€.
jsonEditor.changeType(node, 'boolean', true)λ
Έλμ keyλ₯Ό λ³κ²½ν©λλ€.
jsonEditor.changeKey(node, keyword)node: νμ μ λ³κ²½ν λ Έλ μ리먼νΈkeyword: ν€μλ
λ
Έλμ valueλ₯Ό λ³κ²½ν©λλ€.
jsonEditor.changeValue(node, value)node: νμ μ λ³κ²½ν λ Έλ μ리먼νΈvalue: κ°
λ Έλλ₯Ό 볡μ ν©λλ€.
jsonEditor.duplicate(node, useUpdate)node: 볡μ ν λ Έλ μ리먼νΈuseUpdate: μ€ννκ³ μ λ°μ΄νΈ λ©μλλ₯Ό μ€νν©λλ€.
λ€μκ³Ό κ°μ΄ μ¬μ©ν μ μμ΅λλ€.
jsonEditor.duplicate(node, true)λ Έλλ₯Ό μ κ±°λ νΌμΉ©λλ€.
jsonEditor.fold(node, true)λ°μ΄ν°λ₯Ό κ°μ Έμ΅λλ€.
jsonEditor.import(node, data, useUpdate, useUpdateCount)node: λ°μ΄ν°λ₯Ό μΆκ°ν λ Έλ μ리먼νΈdata: κ°μ Έμ¬ λ°μ΄ν°useUpdate: λ Έλλ₯Ό μΆκ°νκ³ μ λ°μ΄νΈ λ©μλλ₯Ό μ€νν©λλ€.useUpdateCount: λΆλͺ¨λ Έλ λ°μ΄ν° κ°―μλ₯Ό μ λ°μ΄νΈν©λλ€.
λ€μκ³Ό κ°μ΄ μ¬μ©ν μ μμ΅λλ€.
jsonEditor.import(node, { foo: 'bar' }, true, true)λ°μ΄ν°λ₯Ό λͺ¨λ κ΅μ²΄ν©λλ€.
jsonEditor.replace(data, options, useUpdate)data: μλ‘ κ΅μ²΄ν λ°μ΄ν°options: μ΅μ openDepth: λ°μ΄ν°κ° κ΅μ²΄λ λ λ Έλκ° μ΄λ¦¬λ xλ²μ§Έ λμ€
useUpdate: λ Έλλ₯Ό μμ νκ³ μ λ°μ΄νΈ λ©μλλ₯Ό μ€νν©λλ€.
λ€μκ³Ό κ°μ΄ μ¬μ©ν μ μμ΅λλ€.
jsonEditor.replace({ foo: 'bar' }, {
openDepth: 2,
}, true)μλν°μ λ°μ΄ν°λ₯Ό κ°μ Έμ΅λλ€.
jsonEditor.export(node, json, space)node: κ°μ Έμ¬ λ°μ΄ν°μ λ Έλ μ리먼νΈjson: json νμμ λ°μ΄ν° λ³νμ¬λΆspace: json 곡백
λ€μκ³Ό κ°μ΄ μ¬μ©ν μ μμ΅λλ€.
const space = 2 // null,2,'\t'
jsonEditor.export(node, true, space)λ Έλμ λ΄μ©μ λΉμλλ€.
jsonEditor.clear()λ§λ€μ΄μ§ μΈμ€ν΄μ€λ₯Ό νκ΄΄ν©λλ€.
jsonEditor.destroy()μλν°μμ μΌμ΄λ μΌλ€μ μΈλΆμμ μ΄λ²€νΈλ¦¬μ€λλ‘ λ°μμ¬ μ μμ΅λλ€.
ps. λ¨Όμ μμ€μ½λλ λ€μκ³Ό κ°μ΄ μ μν©λλ€.
const jsonEditor = new JsonEditor() const wrap = jsonEditor.el.wrap.get(0) // wrap element
μλν°μ λ΄μ©μ΄ μμ λλ€λ©΄ μ€νλλ μ΄λ²€νΈμ λλ€.
wrap.addEventListener('update', ({ detail }) => {
console.log('updated data', src)
})detail: λ°μ΄ν° κ°μ²΄
컨ν μ€νΈ λ©λ΄κ° μ΄λ¦΄λλ§λ€ μ€νλλ μ΄λ²€νΈμ λλ€. λ©λ΄λ₯Ό 컀μ€ν°λ§μ΄μ¦ ν μ μμΌλ©° μ 곡λ νλΌλ©ν° κ°μ μ΄μ©νμ¬ μν©μ λ§κ² λ©λ΄λ₯Ό μ‘°μν μ μμ΅λλ€.
wrap.addEventListener('context', ({ detail: { body, node, type, isRoot, $ } }) => {
if (!isRoot) return
const $ul = $(body).children()
const $items = $(`
<li><button type="button" data-key="#1">custom #1</button></li>
<li><button type="button" data-key="#2">custom #2</button></li>
`)
$items.find('button').on('click', (e) => {
console.log('click item-key:', $(e.currentTarget).data('key'))
jsonEditor.context.close()
})
$ul.append($items)
})body: μ΄λ¦° 컨ν μ€νΈ λ©λ΄ μμ. μ΄ μ리먼νΈμλ€ νλͺ©μ μ‘°μνλ©΄ λ©λλ€.node: μ νλ λ Έλ μ리먼νΈtype: μ νλ λ Έλμ νμisRoot: νμ¬ μ νλ λ Έλκ° λ£¨νΈμΈμ§ ꡬλΆνλ κ°$: μ»΄ν¬λνΈ λ΄λΆμμ μ¬μ©νλ Cashλ₯Ό μ΄μ©νμ¬ μμ½κ² domμ λ€λ£° μ μμ΅λλ€.
λ€μ κ²½λ‘λ₯Ό μ°Έκ³ νμ¬ λͺ¨λλ€μ import κΈ°λ₯μ μ΄μ©νλλ° μ°Έκ³ ν μ μμ΅λλ€.
@redgoose/json-editor: μ½μ΄ λΌμ΄λΈλ¬λ¦¬@redgoose/json-editor/css: μ€νμΌμνΈ@redgoose/json-editor/lib/umd: μ½μ΄ λΌμ΄λΈλ¬λ¦¬ UMD
μλν°μ λμμΈμ μμ ν μ μλ μμλ€μ λ³μν μμΌ°μ΅λλ€.
λ€μκ³Ό κ°μ΄ μΈλΆ μμμμ μλν° μ€νμΌμ 컀μ€ν°λ§μ΄μ¦ ν μ μμ΅λλ€.
.editor {
--json-editor-color-base: red;
--json-editor-color-focus: blue;
}
@media (prefers-color-scheme: dark) {
.editor {
--json-editor-color-base: green;
--json-editor-color-focus: yellow;
}
}main.scss νμΌμ μ½λλ₯Ό μ°Έκ³ νμ¬ μ§μ μ€νμΌμ νΈμ§ν μ μμ΅λλ€.
ν΄λμ€ λ©μλλ₯Ό κ΅μ²΄νμ¬ μλν° ν μ€νΈλ₯Ό λ³κ²½ν μ μμ΅λλ€.
JsonEditor.prototype.updateLanguage = function()
{
this.lang = Object.assign(this.lang, {
nodeChangeSort: 'λ
Έλ μμλ³κ²½',
nodeContextMenu: 'λ
Έλλ©λ΄',
nodeFold: 'μ κΈ°/νΌμΉκΈ°',
contextChangeType: 'νμ
λ³κ²½',
contextInsertNode: 'λ
ΈλμΆκ°',
contextTypeObject: 'κ°μ²΄',
contextTypeArray: 'λ°°μ΄',
contextTypeString: 'λ¬Έμ',
contextTypeNumber: 'λ²νΈ',
contextTypeBoolean: 'λΆμΈ',
contextTypeNull: 'λ',
contextDuplicate: 'λ
Έλ볡μ ',
contextRemove: 'λ
Έλμμ ',
})
}JSON Editor μλν°λ₯Ό web component, react, vue, svelte κ°μ νκ²½μμ μ¬μ©ν μ μλλ‘ μ»΄ν¬λνΈλ₯Ό λνν μ μμ΅λλ€.
λ€μ λ§ν¬λ₯Ό μ°Έκ³ νμ¬ κ°λ°ν μ μμ΅λλ€.