JsonUtility で Dictionary を使うとても簡単な方法

シリアライズの直前とデシリアライズ直後を拾えるインターフェースがあるので
それを加えた専用Dictionaryクラスを作ればよい。

If you want use Dictionary in JsonUtility.
Than make wrapper class. It is very simple!

[System.Serializable]
//==================================================================
/**
 * @brief Dictionary for JsonUtility
 */
//==================================================================
public class Dict : Dictionary, ISerializationCallbackReceiver
{
 [SerializeField] private List keys = new List();
 [SerializeField] private List vals = new List();

 public void OnBeforeSerialize()
 {
  keys.Clear();
  vals.Clear();

  var e = GetEnumerator();

  while ( e.MoveNext() )
  {
   keys.Add( e.Current.Key );
   vals.Add( e.Current.Value );
  }
 }

 public void OnAfterDeserialize()
 {
  this.Clear();

  int cnt = ( keys.Count<=vals.Count )? keys.Count : vals.Count;
  for (int i=0; i<cnt; ++i )
   this[keys[i]] = vals[i];

 }
}

// あとはDictionaryをDictに置き換えるだけで簡単にJsonUtility対応になる
// You only be replace Dictionary to Dict, then Easy use JsonUtility with Dictionary!
public class DictTest : MonoBehaviour {

 Dict<string,int> test = new Dict<string, int>{
  { "ABC", 123},
  { "DEFGHI", 456},
  { "JKL", 7891011}
 };
 
 string s = string.Empty;
 // Update is called once per frame
 void Update () {
  if( Input.GetKeyDown(KeyCode.T) ){
   s = JsonUtility.ToJson(test);
   Debug.Log("<color=#FF0000>" + s + "</color>");
  }
  
  if( Input.GetKeyDown(KeyCode.F) ){
   var d = JsonUtility.FromJson<Dict>(s);
   foreach( var _ in d ){
    Debug.Log("<color=#00FFFF>[" + _.Key + "]</color>" + _.Value);
   }
  }
 }
}