Skip to content

Commit 76592d7

Browse files
committed
✨ Created extension methods to JValue for json flattening
semver: minor
1 parent 20dc8e6 commit 76592d7

5 files changed

Lines changed: 154 additions & 9 deletions

File tree

EliteAPI.Tests/Flattening.cs

Lines changed: 61 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using FluentAssertions;
2+
using Newtonsoft.Json.Linq;
23

34
namespace EliteAPI.Tests;
45

@@ -45,12 +46,12 @@ public void SimpleArray()
4546
new JsonPath("items[0]", 1, JsonType.Number),
4647
new JsonPath("items[1]", 2, JsonType.Number),
4748
new JsonPath("items[2]", 3, JsonType.Number),
48-
new JsonPath("items.Length", 3, JsonType.Number)
49+
// new JsonPath("items.Length", 3, JsonType.Number)
4950
};
5051

5152
paths.Should().BeEquivalentTo(expected);
5253
}
53-
54+
5455
[Test]
5556
public void ArrayWithObject()
5657
{
@@ -62,15 +63,68 @@ public void ArrayWithObject()
6263
new JsonPath("items[0].nested", 1, JsonType.Number),
6364
new JsonPath("items[1].nested", "2", JsonType.String),
6465
new JsonPath("items[2].nested", false, JsonType.Boolean),
65-
new JsonPath("items.Length", 3, JsonType.Number)
66+
// new JsonPath("items.Length", 3, JsonType.Number)
6667
};
6768

6869
paths.Should().BeEquivalentTo(expected);
6970
}
7071

71-
private List<JsonPath> FlattenJson(string json)
72+
private static List<JsonPath> FlattenJson(string json)
7273
{
7374
// TODO: call flattening function
74-
return [];
75-
}
76-
}
75+
// arrays need Length
76+
// key + localisation
77+
// controls mapping
78+
79+
List<JsonPath> temp = [];
80+
var jToken = JToken.Parse(json);
81+
foreach (var jValue in jToken.GetLeafValues())
82+
{
83+
temp.Add(JValueToJsonType(jValue));
84+
}
85+
86+
return temp;
87+
}
88+
89+
private static JsonPath JValueToJsonType(JValue jValue)
90+
{
91+
switch (jValue.Type)
92+
{
93+
case JTokenType.Integer:
94+
case JTokenType.Float:
95+
return new JsonPath
96+
{
97+
Path = jValue.Path,
98+
Value = Convert.ToInt32(jValue.Value),
99+
Type = JsonType.Number
100+
};
101+
case JTokenType.Uri:
102+
case JTokenType.Guid:
103+
case JTokenType.String:
104+
return new JsonPath
105+
{
106+
Path = jValue.Path,
107+
Value = Convert.ToString(jValue.Value),
108+
Type = JsonType.String
109+
};
110+
case JTokenType.Boolean:
111+
return new JsonPath
112+
{
113+
Path = jValue.Path,
114+
Value = Convert.ToBoolean(jValue.Value),
115+
Type = JsonType.Boolean
116+
};
117+
default:
118+
return new JsonPath
119+
{
120+
Path = "",
121+
Value = "",
122+
Type = JsonType.String
123+
};
124+
}
125+
126+
127+
128+
}
129+
130+
}

EliteAPI/Class1.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using Newtonsoft.Json.Linq;
2+
3+
namespace EliteAPI;
4+
5+
public class EliteApi
6+
{
7+
public static void Main()
8+
{
9+
var file = File.ReadAllLines("C:\\Users\\thevi\\Documents\\WORK_SPACE\\EliteAPI\\EliteAPI.Tests\\TestFiles\\Journals\\Journal.2000-01-01T100000.01.log");
10+
11+
}
12+
}

EliteAPI/EliteAPI.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,8 @@
77
<OutputType>Exe</OutputType>
88
</PropertyGroup>
99

10+
<ItemGroup>
11+
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
12+
</ItemGroup>
13+
1014
</Project>

EliteAPI/JsonExtensions.cs

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
using Newtonsoft;
2+
using Newtonsoft.Json.Linq;
3+
4+
namespace EliteAPI;
5+
6+
public static class JExtensions
7+
{
8+
public static IEnumerable<JValue> GetLeafValues(this JToken jToken)
9+
{
10+
if (jToken is JValue jvalue)
11+
{
12+
yield return jvalue;
13+
}
14+
else if (jToken is JArray jArray)
15+
{
16+
foreach (var result in GetLeafValuesFromJArray(jArray))
17+
{
18+
yield return result;
19+
}
20+
21+
yield return GetLeafValues(JToken.Parse($"{{length :{jArray.Count}}}")).First();
22+
23+
}
24+
else if (jToken is JProperty jProperty)
25+
{
26+
foreach (var result in GetLeafValuesFromJProperty(jProperty))
27+
{
28+
yield return result;
29+
}
30+
}
31+
else if (jToken is JObject jObject)
32+
{
33+
foreach (var result in GetLeafValuesFromJObject(jObject))
34+
{
35+
yield return result;
36+
}
37+
}
38+
}
39+
40+
// PRIVATE HELPERS
41+
42+
// JSONToken -> JsonPath
43+
44+
static IEnumerable<JValue> GetLeafValuesFromJArray(JArray jArray)
45+
{
46+
for (var i = 0; i < jArray.Count; i++)
47+
{
48+
foreach (var result in GetLeafValues(jArray[i]))
49+
{
50+
yield return result;
51+
}
52+
}
53+
}
54+
55+
static IEnumerable<JValue> GetLeafValuesFromJProperty(JProperty jProperty)
56+
{
57+
foreach (var result in GetLeafValues(jProperty.Value))
58+
{
59+
yield return result;
60+
}
61+
}
62+
63+
static IEnumerable<JValue> GetLeafValuesFromJObject(JObject jObject)
64+
{
65+
foreach (var jToken in jObject.Children())
66+
{
67+
foreach (var result in GetLeafValues(jToken))
68+
{
69+
yield return result;
70+
}
71+
}
72+
}
73+
74+
}

EliteAPI/JsonPath.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,6 @@ public enum JsonType
1313
{
1414
String,
1515
Number,
16-
Boolean
17-
}
16+
Boolean,
17+
Date
18+
}

0 commit comments

Comments
 (0)