<form action="">
  <input name='users[123][name]' value="312"/>
</form>
<div class="result"></div>
const serialize = (form) => {
  const obj = {};
	const inputs = [...form.querySelectorAll('input')];
  inputs.forEach((input) => {
    const params = input.name.match(/(?<=\[)\S+?(?=\])|^\S+?(?=\[)/g);
    const value = input.value;
    
    params.reduce((current, param, i, arr) => {
      if (!obj[param]) current[param] = {};
      if (i === arr.length - 1) current[param] = value;
      
      return current[param];
    }, obj);
  });
  
  return obj;
};

const writeResult = (form) => {
  const obj = JSON.stringify(serialize(form));
  document.querySelector('.result').innerText = obj;
};

const form = document.querySelector('form');

writeResult(form);

form.addEventListener('input', () => writeResult(form));

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

This Pen doesn't use any external JavaScript resources.