【特性】lua,yaml格式也支持从子字段读取记录

【修复】修复json格式中读取字段列表时未判定忽略的null数据的bug
main
walon 2021-11-16 09:41:50 +08:00
parent 2034e8050f
commit 9fd76d5334
5 changed files with 60 additions and 28 deletions

View File

@ -687,6 +687,7 @@ xml中定义如下
- 来自某个excel文件的所有单元薄 - 来自某个excel文件的所有单元薄
- 来自某个excel文件的指定单元薄 - 来自某个excel文件的指定单元薄
- 来自json、xml、lua、yaml文件 - 来自json、xml、lua、yaml文件
- 来自json、xml、lua、yaml子字段 (如root.a.b)
- 来自目录树下所有文件,每个文件对应一个记录 - 来自目录树下所有文件,每个文件对应一个记录
- 以上的随意组合 - 以上的随意组合

View File

@ -38,9 +38,6 @@ namespace Luban.ClientServer
[Option('t', "template_search_path", Required = false, HelpText = "string template search path.")] [Option('t', "template_search_path", Required = false, HelpText = "string template search path.")]
public string TemplateSearchPath { get; set; } public string TemplateSearchPath { get; set; }
[Option("timezone", Required = false, HelpText = "default timezone")]
public string DefaultTimeZone { get; set; } = "Asia/Shanghai";
} }
private static void PrintUsage(string err) private static void PrintUsage(string err)
@ -173,7 +170,6 @@ Options:
StringTemplateUtil.AddTemplateSearchPath(options.TemplateSearchPath); StringTemplateUtil.AddTemplateSearchPath(options.TemplateSearchPath);
} }
StringTemplateUtil.AddTemplateSearchPath(FileUtil.GetPathRelateApplicationDirectory("Templates")); StringTemplateUtil.AddTemplateSearchPath(FileUtil.GetPathRelateApplicationDirectory("Templates"));
TimeZoneUtil.DefaultTimeZone = TimeZoneInfo.FindSystemTimeZoneById(options.DefaultTimeZone);
GenServer.Ins.Start(true, options.Port, ProtocolStub.Factories); GenServer.Ins.Start(true, options.Port, ProtocolStub.Factories);
GenServer.Ins.RegisterJob("cfg", new Luban.Job.Cfg.JobController()); GenServer.Ins.RegisterJob("cfg", new Luban.Job.Cfg.JobController());

View File

@ -14,20 +14,20 @@ namespace Luban.Job.Cfg.DataSources.Json
{ {
private JsonElement _data; private JsonElement _data;
public override void Load(string rawUrl, string sheetName, Stream stream) public override void Load(string rawUrl, string sheetOrFieldName, Stream stream)
{ {
RawUrl = rawUrl; RawUrl = rawUrl;
this._data = JsonDocument.Parse(stream).RootElement; this._data = JsonDocument.Parse(stream).RootElement;
if (!string.IsNullOrEmpty(sheetName)) if (!string.IsNullOrEmpty(sheetOrFieldName))
{ {
if (sheetName.StartsWith("*")) if (sheetOrFieldName.StartsWith("*"))
{ {
sheetName = sheetName.Substring(1); sheetOrFieldName = sheetOrFieldName.Substring(1);
} }
if (!string.IsNullOrEmpty(sheetName)) if (!string.IsNullOrEmpty(sheetOrFieldName))
{ {
foreach (var subField in sheetName.Split('.')) foreach (var subField in sheetOrFieldName.Split('.'))
{ {
_data = _data.GetProperty(subField); _data = _data.GetProperty(subField);
} }
@ -40,12 +40,16 @@ namespace Luban.Job.Cfg.DataSources.Json
var records = new List<Record>(); var records = new List<Record>();
foreach (var ele in _data.EnumerateArray()) foreach (var ele in _data.EnumerateArray())
{ {
records.Add(ReadBean(ele, type)); Record rec = ReadRecord(ele, type);
if (rec != null)
{
records.Add(rec);
}
} }
return records; return records;
} }
private Record ReadBean(JsonElement ele, TBean type) private Record ReadRecord(JsonElement ele, TBean type)
{ {
List<string> tags; List<string> tags;
if (ele.TryGetProperty(TAG_KEY, out var tagEle)) if (ele.TryGetProperty(TAG_KEY, out var tagEle))
@ -68,7 +72,7 @@ namespace Luban.Job.Cfg.DataSources.Json
public override Record ReadOne(TBean type) public override Record ReadOne(TBean type)
{ {
return ReadBean(_data, type); return ReadRecord(_data, type);
} }
} }
} }

View File

@ -22,6 +22,21 @@ namespace Luban.Job.Cfg.DataSources.Lua
RawUrl = rawUrl; RawUrl = rawUrl;
_env = LuaManager.CreateEnvironment(); _env = LuaManager.CreateEnvironment();
_dataTable = (LuaTable)_env.DoChunk(new StreamReader(stream, Encoding.UTF8), rawUrl)[0]; _dataTable = (LuaTable)_env.DoChunk(new StreamReader(stream, Encoding.UTF8), rawUrl)[0];
if (!string.IsNullOrEmpty(sheetName))
{
if (sheetName.StartsWith("*"))
{
sheetName = sheetName.Substring(1);
}
if (!string.IsNullOrEmpty(sheetName))
{
foreach (var subField in sheetName.Split('.'))
{
_dataTable = (LuaTable)_dataTable[subField];
}
}
}
} }
public override List<Record> ReadMulti(TBean type) public override List<Record> ReadMulti(TBean type)

View File

@ -12,40 +12,56 @@ namespace Luban.Job.Cfg.DataSources.Yaml
{ {
class YamlDataSource : AbstractDataSource class YamlDataSource : AbstractDataSource
{ {
private YamlMappingNode _root; private YamlNode _root;
public override void Load(string rawUrl, string sheetName, Stream stream) public override void Load(string rawUrl, string sheetOrFieldName, Stream stream)
{ {
var ys = new YamlStream(); var ys = new YamlStream();
ys.Load(new StreamReader(stream)); ys.Load(new StreamReader(stream));
var rootNode = (YamlMappingNode)ys.Documents[0].RootNode; var rootNode = ys.Documents[0].RootNode;
if (string.IsNullOrEmpty(sheetName))
this._root = rootNode;
if (!string.IsNullOrEmpty(sheetOrFieldName))
{ {
this._root = rootNode; if (sheetOrFieldName.StartsWith("*"))
}
else
{
if (rootNode.Children.TryGetValue(new YamlScalarNode(sheetName), out var childNode))
{ {
this._root = (YamlMappingNode)childNode; sheetOrFieldName = sheetOrFieldName.Substring(1);
} }
else if (!string.IsNullOrEmpty(sheetOrFieldName))
{ {
throw new Exception($"yaml文件:{RawUrl} 不包含子字段:{sheetName}"); foreach (var subField in sheetOrFieldName.Split('.'))
{
this._root = _root[new YamlScalarNode(subField)];
}
} }
} }
} }
public override List<Record> ReadMulti(TBean type) public override List<Record> ReadMulti(TBean type)
{ {
throw new NotImplementedException(); var records = new List<Record>();
foreach (var ele in (YamlSequenceNode)_root)
{
var rec = ReadRecord(ele, type);
if (rec != null)
{
records.Add(rec);
}
}
return records;
} }
private readonly static YamlScalarNode s_tagNameNode = new(TAG_KEY); private readonly static YamlScalarNode s_tagNameNode = new(TAG_KEY);
public override Record ReadOne(TBean type) public override Record ReadOne(TBean type)
{
return ReadRecord(_root, type);
}
private Record ReadRecord(YamlNode yamlNode, TBean type)
{ {
string tagName; string tagName;
if (_root.Children.TryGetValue(s_tagNameNode, out var tagNode)) if (((YamlMappingNode)yamlNode).Children.TryGetValue(s_tagNameNode, out var tagNode))
{ {
tagName = (string)tagNode; tagName = (string)tagNode;
} }
@ -57,7 +73,7 @@ namespace Luban.Job.Cfg.DataSources.Yaml
{ {
return null; return null;
} }
var data = (DBean)type.Apply(YamlDataCreator.Ins, _root, (DefAssembly)type.Bean.AssemblyBase); var data = (DBean)type.Apply(YamlDataCreator.Ins, yamlNode, (DefAssembly)type.Bean.AssemblyBase);
var tags = DataUtil.ParseTags(tagName); var tags = DataUtil.ParseTags(tagName);
return new Record(data, RawUrl, tags); return new Record(data, RawUrl, tags);
} }