Arnab
Arnab

Reputation: 2354

Parsing json files of different schemas to different tables json.net

I'm receiving json files of different schema and have to dump them in sql data base.

The json files have the schema

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

Corresponding to each type of schema I have a strongly typed class named similar to the type but with word 'Table' attached..

eg. 'abcTable' which has only the schema of json.data (column1, column2, ...)

So, what I can do is do a dynamic deserializing of the main json and then based on the type value do a strongly typed json parsing of the corresponding data

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

Here I'm deserializing the object twice, so don't look like the right way of doing..

Also I have 25+ such schemas and a similar number of classes/tables

So, I will be using a lot of if / else if /else statements...

I would like to understand if there are other better ways of solving what I'm trying to do..

Any help is sincerely appreciated..

Thanks

Upvotes: 0

Views: 715

Answers (1)

user2160375
user2160375

Reputation:

As usually, JObject is your friend:

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

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

I order to avoid many ifs, you can use the follwing pattern:

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
    }
}

usage:

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"]);

EDIT: Adding multiple handlers:

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

or

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

Upvotes: 3

Related Questions