public StringBuilder toJsonString()

in dbsync/src/main/java/com/taobao/tddl/dbsync/binlog/JsonConversion.java [282:416]


        public StringBuilder toJsonString(StringBuilder buf, Charset charset) {
            switch (m_type) {
                case OBJECT:
                    buf.append("{");
                    for (int i = 0; i < m_element_count; ++i) {
                        if (i > 0) {
                            buf.append(", ");
                        }
                        buf.append('"').append(escapse(key(i, charset))).append('"');
                        buf.append(": ");
                        element(i, charset).toJsonString(buf, charset);
                    }
                    buf.append("}");
                    break;
                case ARRAY:
                    buf.append("[");
                    for (int i = 0; i < m_element_count; ++i) {
                        if (i > 0) {
                            buf.append(", ");
                        }
                        element(i, charset).toJsonString(buf, charset);
                    }
                    buf.append("]");
                    break;
                case DOUBLE:
                    buf.append(Double.valueOf(m_double_value).toString());
                    break;
                case INT:
                    buf.append(m_int_value.toString());
                    break;
                case UINT:
                    buf.append(m_int_value.toString());
                    break;
                case LITERAL_FALSE:
                    buf.append("false");
                    break;
                case LITERAL_TRUE:
                    buf.append("true");
                    break;
                case LITERAL_NULL:
                    buf.append("null");
                    break;
                case OPAQUE:
                    String text = null;
                    if (m_field_type == LogEvent.MYSQL_TYPE_NEWDECIMAL) {
                        int precision = m_data.getInt8();
                        int scale = m_data.getInt8();
                        text = m_data.getDecimal(precision, scale).toPlainString();
                        buf.append(text);
                    } else if (m_field_type == LogEvent.MYSQL_TYPE_TIME) {
                        long packed_value = m_data.getLong64();
                        if (packed_value == 0) {
                            text = "00:00:00";
                        } else {
                            long ultime = Math.abs(packed_value);
                            long intpart = ultime >> 24;
                            int frac = (int) (ultime % (1L << 24));
                            // text = String.format("%s%02d:%02d:%02d",
                            // packed_value >= 0 ? "" : "-",
                            // (int) ((intpart >> 12) % (1 << 10)),
                            // (int) ((intpart >> 6) % (1 << 6)),
                            // (int) (intpart % (1 << 6)));
                            // text = text + "." + usecondsToStr(frac, 6);
                            StringBuilder builder = new StringBuilder(17);
                            if (packed_value < 0) {
                                builder.append('-');
                            }

                            int d = (int) ((intpart >> 12) % (1 << 10));
                            if (d > 100) {
                                builder.append(String.valueOf(d));
                            } else {
                                appendNumber2(builder, d);
                            }
                            builder.append(':');
                            appendNumber2(builder, (int) ((intpart >> 6) % (1 << 6)));
                            builder.append(':');
                            appendNumber2(builder, (int) (intpart % (1 << 6)));

                            builder.append('.').append(usecondsToStr(frac, 6));
                            text = builder.toString();
                        }
                        buf.append('"').append(text).append('"');
                    } else if (m_field_type == LogEvent.MYSQL_TYPE_DATE || m_field_type == LogEvent.MYSQL_TYPE_DATETIME
                               || m_field_type == LogEvent.MYSQL_TYPE_TIMESTAMP) {
                                   long packed_value = m_data.getLong64();
                                   if (packed_value == 0) {
                                       text = "0000-00-00 00:00:00";
                                   } else {
                                       // 构造TimeStamp只处理到秒
                                       long ultime = Math.abs(packed_value);
                                       long intpart = ultime >> 24;
                                       int frac = (int) (ultime % (1L << 24));
                                       long ymd = intpart >> 17;
                                       long ym = ymd >> 5;
                                       long hms = intpart % (1 << 17);
                                       // text =
                                       // String.format("%04d-%02d-%02d %02d:%02d:%02d",
                                       // (int) (ym / 13),
                                       // (int) (ym % 13),
                                       // (int) (ymd % (1 << 5)),
                                       // (int) (hms >> 12),
                                       // (int) ((hms >> 6) % (1 << 6)),
                                       // (int) (hms % (1 << 6)));
                                       StringBuilder builder = new StringBuilder(26);
                                       appendNumber4(builder, (int) (ym / 13));
                                       builder.append('-');
                                       appendNumber2(builder, (int) (ym % 13));
                                       builder.append('-');
                                       appendNumber2(builder, (int) (ymd % (1 << 5)));
                                       builder.append(' ');
                                       appendNumber2(builder, (int) (hms >> 12));
                                       builder.append(':');
                                       appendNumber2(builder, (int) ((hms >> 6) % (1 << 6)));
                                       builder.append(':');
                                       appendNumber2(builder, (int) (hms % (1 << 6)));
                                       builder.append('.').append(usecondsToStr(frac, 6));
                                       text = builder.toString();
                                   }
                                   buf.append('"').append(text).append('"');
                               } else {
                                   text = m_data.getFixString((int) m_length, charset);
                                   buf.append('"').append(escapse(text)).append('"');
                               }

                    break;
                case STRING:
                    buf.append('"').append(escapse(m_string_value)).append('"');
                    break;
                case ERROR:
                    throw new IllegalArgumentException("illegal json data");
            }

            return buf;
        }