namespace etoy { /// /// KeyValue表特殊,单独处理一套 /// class JsonKeyValueGenerater : IGenerater { private JsonWriter _writer; private Dictionary _fieldmap; /// /// KeyValue 字段数量 /// private const int KV_FIELDS_COUNT = 4; private string[] _kv_keys = { RuleCenterJsonStructureDefine.KVTable_Key, RuleCenterJsonStructureDefine.KVTable_Value, RuleCenterJsonStructureDefine.KVTable_Type, RuleCenterJsonStructureDefine.KVTable_Description }; private string[] _kv_values = new string[KV_FIELDS_COUNT]; private int GetKeyValueMaxLength(string key, string msg) { var msglen = RuleCenterUtil.GetJsonStringLength(msg); return Math.Max(_fieldmap[key].len, msglen); } /// /// 初始化KeyValue表字段 /// private void InitKeyValueFieldsMap() { for (int i = 0, len = _kv_keys.Length; i < len; i++) { var key = _kv_keys[i]; _fieldmap.Add(key, new RuleCenterField { name = key, type = RuleCenterTypeDefine.Varchar }); } } private void KeyValueRowsJsonGenerater(KeyValueRow row) { if (!row.IsServerField) return; _kv_values[0] = row.Key; _kv_values[1] = row.Value.ToInlayString(); _kv_values[2] = RuleCenterUtil.ToRuleCenterType(row.Type, false); _kv_values[3] = row.Description.ToInlayString(); _writer.Bracket(); { _writer.EnumeratorToJson(_kv_keys, _kv_keys.Length, (index, _) => { var key = _kv_keys[index]; var value = _kv_values[index]; _fieldmap[key].len = GetKeyValueMaxLength(key, value); _writer.AppendKey(key).Append(value); }); } _writer.EndBracket(); } private void KeyValueTalbeRowsGenerate(KeyValueTable table) { _writer.AppendKey(RuleCenterJsonStructureDefine.Table_Rows).NewLine().ArrayBracket().Indent(); { var rows = table.Rows; InitKeyValueFieldsMap(); _writer.EnumeratorToJson(rows, rows.Length, (_, row) => { _writer.NewLine(); KeyValueRowsJsonGenerater(row); }); } _writer.Dedent().NewLine().EndArrayBracket(); } private void TableGenerate(KeyValueTable table) { _fieldmap.Clear(); _writer.Bracket().Indent().NewLine(); { _writer.AppendKey(RuleCenterJsonStructureDefine.Table_Name).Append(table.Name); _writer.Dot().NewLine(); KeyValueTalbeRowsGenerate(table); _writer.Dot().NewLine(); _writer.OnFields(_fieldmap); } _writer.Dedent().NewLine().EndBracket(); } public void Generate(Context context) { _fieldmap = new Dictionary(); var kvtables = context.Blackboard.KeyValueTables; _writer.EnumeratorToJson(kvtables, kvtables.Count, (_, table) => { _writer.NewLine(); TableGenerate(table); }); } public JsonKeyValueGenerater(JsonWriter writer) { this._writer = writer; } } }