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());
        }