Skip to content

Commit

Permalink
Add CSharpObjectBuilder / generate C# new object from json
Browse files Browse the repository at this point in the history
  • Loading branch information
nh43de committed Dec 29, 2023
1 parent a97a189 commit 70859f7
Show file tree
Hide file tree
Showing 3 changed files with 195 additions and 4 deletions.
46 changes: 42 additions & 4 deletions src/DataPowerTools.Connectivity/Json/DataReaderJsonExtensions.cs
@@ -1,5 +1,4 @@
using System;
using System.Collections.Generic;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
Expand All @@ -8,7 +7,6 @@
using System.Text.Json.Nodes;
using DataPowerTools.Extensions;
using DataPowerTools.PowerTools;
using Microsoft.Identity.Client;
using SimpleCSV;

namespace DataPowerTools.Connectivity.Json
Expand Down Expand Up @@ -131,6 +129,47 @@ void WriteHeaders(JsonElement jsonElement)
return sb.ToString();
}

/// <summary>
/// Creates insert statements from an array of json objects.
/// </summary>
public static string FromJsonToCsharpObjectInit(this string jsonString)
{
var isb = new CSharpObjectBuilder();

var el = JsonDocument.Parse(jsonString).RootElement;

//enumerate array
foreach (var jsonElement in el.EnumerateArray())
{
//enumerate object
if (jsonElement.ValueKind != JsonValueKind.Object)
continue;

var objEnumerator = jsonElement.EnumerateObject();

var inits = objEnumerator
.Select(jsonProperty => new CSharpObjectBuilder.CSharpObjectInit()
{
DataType = jsonProperty.Value.ValueKind == JsonValueKind.Number
? CSharpObjectBuilder.CSharpObjInitType.Numeric
: CSharpObjectBuilder.CSharpObjInitType.String,
Name = jsonProperty.Name,
Value = jsonProperty.Value.ToString()
}
).ToArray();

var def = new CSharpObjectBuilder.CSharpObjectInitDef()
{
Inits = inits
};

isb.AddCSharpObjectDef(def);
}

return isb.ToString();
}


/// <summary>
/// Creates insert statements from an array of json objects.
/// </summary>
Expand All @@ -143,7 +182,6 @@ public static string FromJsonToSqlInsertStatements(this string jsonString, strin
//var el = ParseJsonAsArray(jsonString);
var el = JsonDocument.Parse(jsonString).RootElement;


//enumerate array
foreach (var jsonElement in el.EnumerateArray())
{
Expand Down
45 changes: 45 additions & 0 deletions src/DataPowerTools.Tests/JsonDataReaderExtensionsTests.cs
Expand Up @@ -40,6 +40,51 @@ public void TestDataReaderToJsonExtension()
]", r);
}

//
[TestMethod]
public void TestGenerateCSharpObjectInitFromJson()
{
var json = @"[
{
""Col1"": ""AAA"",
""Col2"": ""AA"",
""Col 3"": 1
},
{
""Col1"": ""AAB"",
""Col2"": ""AA"",
""Col 3"": ""2""
},
{
""Col1"": ""AAC"",
""Col2"": ""AB"",
""Col 3"": ""3"",
""Col4"": ""Z""
}
]";

var dd = json.FromJsonToCsharpObjectInit();

Assert.AreEqual(@"new[] {
new() {
Col1 = ""AAA"",
Col2 = ""AA"",
Col3 = 1
},
new() {
Col1 = ""AAB"",
Col2 = ""AA"",
Col3 = ""2""
},
new() {
Col1 = ""AAC"",
Col2 = ""AB"",
Col3 = ""3"",
Col4 = ""Z""
}
}", dd);
}

[TestMethod]
public void TestGenerateSqlInsertsFromJson()
{
Expand Down
108 changes: 108 additions & 0 deletions src/DataPowerTools/PowerTools/CsharpObjectBuilder.cs
@@ -0,0 +1,108 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DataPowerTools.Extensions;

namespace DataPowerTools.PowerTools
{
public class CSharpObjectBuilder
{
private readonly List<CSharpObjectInitDef> _defs = [];

//private readonly StringBuilder _s = new StringBuilder();

public CSharpObjectBuilder()
{

}

public void AddCSharpObjectDef(IEnumerable<CSharpObjectInitDef> defs)
{
_defs.AddRange(defs);
}

public void AddCSharpObjectDef(CSharpObjectInitDef def)
{
_defs.Add(def);
}

public override string ToString()
{
var s = new StringBuilder();

switch (_defs.Count)
{
case 0:
return string.Empty;
case 1:
return BuildDefinition(_defs.First());
}

return BuildDefinition(_defs.ToArray());
}

public static string BuildDefinition(string val, CSharpObjInitType initType)
{
switch (initType)
{
case CSharpObjInitType.Default:
case CSharpObjInitType.String:
return $@"""{val}""";
break;
case CSharpObjInitType.Numeric:
return val;
break;
default:
throw new ArgumentOutOfRangeException(nameof(initType), initType, null);
}
}

public static string BuildDefinition(CSharpObjectInitDef[] initsDefs)
{
var subItems = initsDefs
.Select(BuildDefinition)
.JoinStr(",\r\n");

var template = $@"new[] {{
{subItems.Indent(1)}
}}";

return template;
}

public static string BuildDefinition(CSharpObjectInitDef init)
{
var subItems = init
.Inits
.Select(def => $@"{def.Name.Replace(" ", "")} = {BuildDefinition(def.Value, def.DataType)}")
.JoinStr(",\r\n");

var template = $@"new() {{
{subItems.Indent(1)}
}}";

return template;
}

public class CSharpObjectInitDef
{
//public string? TypeName
public CSharpObjectInit[] Inits { get; set; }
}

public class CSharpObjectInit
{
public string Name { get; set; }
public string Value { get; set; }
public CSharpObjInitType DataType { get; set; }
}

public enum CSharpObjInitType
{
Default,
String,
Numeric
}
}
}

0 comments on commit 70859f7

Please sign in to comment.