【特性】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文件的指定单元薄
- 来自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.")]
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)
@ -173,7 +170,6 @@ Options:
StringTemplateUtil.AddTemplateSearchPath(options.TemplateSearchPath);
}
StringTemplateUtil.AddTemplateSearchPath(FileUtil.GetPathRelateApplicationDirectory("Templates"));
TimeZoneUtil.DefaultTimeZone = TimeZoneInfo.FindSystemTimeZoneById(options.DefaultTimeZone);
GenServer.Ins.Start(true, options.Port, ProtocolStub.Factories);
GenServer.Ins.RegisterJob("cfg", new Luban.Job.Cfg.JobController());

View File

@ -14,20 +14,20 @@ namespace Luban.Job.Cfg.DataSources.Json
{
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;
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);
}
@ -40,12 +40,16 @@ namespace Luban.Job.Cfg.DataSources.Json
var records = new List<Record>();
foreach (var ele in _data.EnumerateArray())
{
records.Add(ReadBean(ele, type));
Record rec = ReadRecord(ele, type);
if (rec != null)
{
records.Add(rec);
}
}
return records;
}
private Record ReadBean(JsonElement ele, TBean type)
private Record ReadRecord(JsonElement ele, TBean type)
{
List<string> tags;
if (ele.TryGetProperty(TAG_KEY, out var tagEle))
@ -68,7 +72,7 @@ namespace Luban.Job.Cfg.DataSources.Json
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;
_env = LuaManager.CreateEnvironment();
_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)

View File

@ -12,40 +12,56 @@ namespace Luban.Job.Cfg.DataSources.Yaml
{
class YamlDataSource : AbstractDataSource
{
private YamlMappingNode _root;
public override void Load(string rawUrl, string sheetName, Stream stream)
private YamlNode _root;
public override void Load(string rawUrl, string sheetOrFieldName, Stream stream)
{
var ys = new YamlStream();
ys.Load(new StreamReader(stream));
var rootNode = (YamlMappingNode)ys.Documents[0].RootNode;
if (string.IsNullOrEmpty(sheetName))
var rootNode = ys.Documents[0].RootNode;
this._root = rootNode;
if (!string.IsNullOrEmpty(sheetOrFieldName))
{
this._root = rootNode;
}
else
{
if (rootNode.Children.TryGetValue(new YamlScalarNode(sheetName), out var childNode))
if (sheetOrFieldName.StartsWith("*"))
{
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)
{
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);
public override Record ReadOne(TBean type)
{
return ReadRecord(_root, type);
}
private Record ReadRecord(YamlNode yamlNode, TBean type)
{
string tagName;
if (_root.Children.TryGetValue(s_tagNameNode, out var tagNode))
if (((YamlMappingNode)yamlNode).Children.TryGetValue(s_tagNameNode, out var tagNode))
{
tagName = (string)tagNode;
}
@ -57,7 +73,7 @@ namespace Luban.Job.Cfg.DataSources.Yaml
{
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);
return new Record(data, RawUrl, tags);
}