internal string ToJsonString()
        {
            var sb = new StringBuilder();

            using(var sw = new StringWriter(sb))
            using(JsonWriter jw = new JsonTextWriter(sw))
            {
                jw.WriteStartObject();
                jw.WritePropertyName("props");
                jw.WriteStartObject();
                jw.WriteNullableProperty("n_val", NVal)
                  .WriteNullableProperty("allow_mult", AllowMultiple)
                  .WriteNullableProperty("last_write_wins", LastWriteWins)
                  .WriteNullableProperty("r", RVal)
                  .WriteNullableProperty("rw", RwVal)
                  .WriteNullableProperty("dw", DwVal)
                  .WriteNullableProperty("w", WVal)
                  .WriteNullableProperty("pr", PrVal)
                  .WriteNullableProperty("pw", PwVal)
                  .WriteNonNullProperty("backend", Backend)
                  .WriteNullableProperty("notfound_ok", NotFoundOk)
                  .WriteNullableProperty("basic_quorum", BasicQuorum)
                  .WriteNullableProperty("has_precommit", HasPrecommit)
                  .WriteNullableProperty("has_postcommit", HasPostcommit);

                if(PreCommitHooks != null)
                {
                    jw.WritePropertyName("precommit");
                    jw.WriteStartArray();
                    PreCommitHooks.ForEach(hook => hook.WriteJson(jw));
                    jw.WriteEndArray();
                }

                if(PostCommitHooks != null)
                {
                    jw.WritePropertyName("postcommit");
                    jw.WriteStartArray();
                    PostCommitHooks.ForEach(hook => hook.WriteJson(jw));
                    jw.WriteEndArray();
                }

                jw.WriteEndObject();
                jw.WriteEndObject();
            }

            return sb.ToString();
        }