【问题标题】:Parsing json files of different schemas to different tables json.net解析不同模式的json文件到不同的表json.net
【发布时间】:2014-09-01 01:53:41
【问题描述】:

我正在接收不同模式的 json 文件,必须将它们转储到 sql 数据库中。

json 文件具有架构

{'type':'abc','data':{'column1':'x','column2':'y',.........}}

对应于每种类型的架构,我有一个强类型类,其名称与类型相似,但附加了单词“Table”..

例如。 'abcTable' 只有 json.data (column1, column2, ...) 的模式

所以,我可以做的是对主json进行动态反序列化,然后根据类型值对相应数据进行强类型json解析

dynamic jsondata = JsonConvert.DeserializeObject<dynamic>(json);
if (jsonata.type=='abc')
{
var abcobj = JsonConvert.DeserializeObject<abcTable>(jsondata.data);
}

这里我反序列化对象两次,所以看起来不像是正确的做法..

我还有 25 多个这样的模式和类似数量的类/表

所以,我会使用很多 if / else if /else 语句...

我想了解是否有其他更好的方法来解决我正在尝试做的事情..

真诚感谢任何帮助..

谢谢

【问题讨论】:

  • 请看我的编辑,我提出了避免很多 if 的代码。

标签: c# json json.net


【解决方案1】:

像往常一样,JObject 是你的朋友:

var parsed = JObject.Parse(json);
var type = parsed.Value<string>("type");

if (type == "abc")
{
   var abcObject = parsed["data"].ToObject<abcTable>();
}

为了避免很多ifs,你可以使用以下模式:

public interface ITableType
{
    bool Match(string type);
    void Handle(JToken jsonTable);
}

public AbcTableHandler: ITableType
{
    public bool Match(string type)
    {
        return type == "abc";
    }

    public void Handle(JToken jsonTable)
    {
        var abcTable = jsonTable.ToObject<abcTable>();
        // other code
    }
}

用法:

var handlers = new[] { new  AbcTableHandler() };
// ...
var parsed = JObject.Parse(json);
var type = parsed.Value<string>("type");
var handler = handlers.SingleOfDefault(h => h.Match(type));
if (handler == null) 
       throw new InvalidOperationException("Cannot find handler for " + type);
handler.Handle(parsed["data"]);

编辑: 添加多个处理程序:

var handlers = new ITableType[] { new AbcTableHandler(), new OtherHandler, etc.. };

var handlers = new List<ITableType>();
handlers.Add(new AbcTableHandler());
handlers.Add(new OtherHandler());

【讨论】:

  • 我认为应该是 handlers.FirstOrDefault,以及如何在 var handlers, Tx 中添加另一个 handler'XyzTableHandler'
  • 我只找到了一个使用 new[].. var StaffMembers = new[] { new Employee(20204, "Harry Fields", EmploymentStatus.FullTime, 16.85), new Employee(92857, "詹妮弗杏仁”,EmploymentStatus.FullTime,22.25),新员工(42963,“Sharon Culbritt”,EmploymentStatus.PartTime,10.95)};请让知道如何添加多个处理程序--Tx
猜你喜欢
  • 2013-12-02
  • 1970-01-01
  • 2016-02-02
  • 2018-08-26
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多