Weknow.Text.Json.Extensions
5.1.50
dotnet add package Weknow.Text.Json.Extensions --version 5.1.50
NuGet\Install-Package Weknow.Text.Json.Extensions -Version 5.1.50
<PackageReference Include="Weknow.Text.Json.Extensions" Version="5.1.50" />
paket add Weknow.Text.Json.Extensions --version 5.1.50
#r "nuget: Weknow.Text.Json.Extensions, 5.1.50"
// Install Weknow.Text.Json.Extensions as a Cake Addin #addin nuget:?package=Weknow.Text.Json.Extensions&version=5.1.50 // Install Weknow.Text.Json.Extensions as a Cake Tool #tool nuget:?package=Weknow.Text.Json.Extensions&version=5.1.50
Weknow Json Extensions
Functionality of this library includes:
- YieldWhen
- Filter
- [Path based Filter][#Path-based-Filter]
- Exclude
- TryAddProperty
- Merge
- Serialization
YieldWhen
Enumerate over json elements.
With Path
Rely on path convention:
json.YieldWhen(/path convention/);
{
"friends": [
{
"name": "Yaron",
"id": 1
},
{
"name": "Aviad",
"id": 2
}
]
}
- "friends.[].name" or "friends.*.name" will result with ["Yaron", "Aviad"]
- "friends.[0].name" or "friends.*.name" will result with ["Yaron"]
- "friends.[0].*" or "friends.*.name" will result with ["Yaron",1]
See: YieldWhen_Path_Test
With Filter
using static System.Text.Json.TraverseFlowInstruction;
var items = source.YieldWhen((json, deep, breadcrumbs) =>
{
string last = breadcrumbs[^1];
if(deep == 0 && last == "skills")
return Drill;
return deep switch
{
< 3 => Drill,
_ => Do(TraverseFlow.SkipToParent),
};
});
Filter
Filter operation, clean up the element according to a filter.
It excludes whatever doesn't match the filter
{
"A": 10,
"B": [
{ "Val": 40 },
{ "Val": 20 },
{ "Factor": 20 }
],
"C": [0, 25, 50, 100 ],
"Note": "Re-shape json"
}
Filter:
JsonElement source = ..;
var target = source.Filter((e, _, _) =>
e.ValueKind != JsonValueKind.Number || e.GetInt32() > 30
? TraverseFlowWrite.Drill
: TraverseFlowWrite.Skip);
Will result in:
{
"B": [ { "Val": 40 }],
"C": [ 50, 100 ],
"Note": "Re-shape json"
}
Path based Filter
var target = source.Filter("B.*.val");
// results: {"B":[{"Val":40},{"Val":20}]}
var target = source.Filter("B.[]");
// results: {"B":[{"Val":40},{"Val":20},{"Factor":20}]}
var target = source.Filter("B.[].Factor");
// results: {"B":[{"Factor":20}]}
var target = source.Filter("B.[1].val");
// results: {"B":[{"Val":20}]}
Exclude
Exclude is kind of opposite of Filter. It instruct which elements to remove.
{
"A": 10,
"B": [
{ "Val": 40 },
{ "Val": 20 },
{ "Factor": 20 }
],
"C": [0, 25, 50, 100 ],
"Note": "Re-shape json"
}
var target = source.Exclude("B.*.val");
// results: {"A":10,"B":[{"Factor":20}],"C":[0,25,50,100],"Note":"Re-shape json"}
var target = source.Exclude("B.[]");
// results: {"A":10,"B":[],"C":[],"Note":"Re-shape json"}
var target = source.Exclude("B.[1]");
// results: {"A":10,"B":[{"Val":40},{"Factor":20}],"C":[0,50,100],"Note":"Re-shape json"}
var target = source.Exclude("B");
// results: {"A":10,"C":[0,25,50,100],"Note":"Re-shape json"}
TryAddProperty
Try to add property if missing.
Sample 1
{ "A": 0, "B": 0 }
var source = JsonDocument.Parse(json);
source.RootElement.TryAddProperty("C", 1);
Result in:
{ "A": 0, "B": 0, "C": 1 }
Sample 2
{ "A": 0, "B": 0, "C": 0 }
var source = JsonDocument.Parse(json);
source.RootElement.TryAddProperty("C", 1);
Result in:
{ "A": 0, "B": 0, "C": 0 }
Sample 3
{ "A": 0, "B": 0, "C": null }
var source = JsonDocument.Parse(json);
source.RootElement.TryAddProperty("C", 1);
Result in:
{ "A": 0, "B": 0, "C": 1 }
Unless sets the options not to ignore null
var options = new JsonPropertyModificatonOpions
{
IgnoreNull = false
};
var source = JsonDocument.Parse(json);
source.RootElement.TryAddProperty("C", 1);
Which will result in:
{ "A": 0, "B": 0, "C": null }
Sample 4
Changing property within a path
{
"X": {
"Y": {
"A": 0,
"B": 0
}
},
"Q": 2
} "Q": 2
}
var source = JsonDocument.Parse(json);
source.RootElement.TryAddProperty("X.Y", "C", 1);
Result in:
{
"X": {
"Y": {
"A": 0,
"B": 0,
"C": 1
}
},
"Q": 2
}
Merge
Merging 2 or more json. The last json will override previous on conflicts
{
"A": 1
}
{
"B": 2
}
var target = source.Merge(joined);
// results: {"A":1,"B":2}
var target = source.Merge(new { B = 2}); // anonymous type
// results: {"A":1,"b":2}
More scenarios:
- {"A":1}.Merge({"B":2,"C":3}) = {"A":1, "B":2, "C"":3}
- {"A":1}.Merge({"B":2},{"C":3}) = {"A":1, "B":2, "C"":3}
- {"A":1}.Merge({"B":2},{"C":3}) = {"A":1, "B":2, "C"":3}
Merge Into
Merging json into specific path of a source json. The last json will override previous on conflicts
{
"A": 1,
"B": {
"B1":[1,2,3]
}
}
var joined = 5;
var target = source.MergeInto("B.B1.[1]", joined);
// results: { "A": 1, "B": { "B1":[1,5,3] }
}
var joined = ... // {"New":"Object"};
var target = source.MergeInto("B.B1.[1]", joined);
// results: { "A": 1, "B": { "B1":[1,{"New":"Object"},3] }
}
var joined = new {"New":"Object"}; // anonymous type
var target = source.MergeInto("B.B1.[1]", joined);
// results: { "A": 1, "B": { "B1":[1,{"new":"Object"},3] }
}
Serialization
ToJson
Convert .NET object into JsonElement.
var entity = new Entity(12, new BEntity("Z"));
JsonElement json = entity.ToJson();
var arr = new []{ 1, 2, 3 };
JsonElement json = arr.ToJson();
AsString
Convert JsonElement to string
JsonElement json = ...;
string compact = json.AsString();
string indented = json.AsIndentString();
string raw = json.GetRawText(); // same as json.AsIndentString();
ToStream
Convert JsonElement to stream
JsonElement json = ...;
Stream srm
### ImmutableDictionary converter.
``` csharp
JsonStringEnumConverter EnumConvertor = new JsonStringEnumConverter(JsonNamingPolicy.CamelCase);
var options = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
// Add the converter
Converters = { EnumConvertor, JsonImmutableDictionaryConverter.Default }
};
var source = new Dictionary<ConsoleColor, string>
{
[ConsoleColor.Blue] = nameof(ConsoleColor.Blue),
[ConsoleColor.White] = nameof(ConsoleColor.White)
};
string json = JsonSerializer.Serialize(source, options);
T deserialized = JsonSerializer.Deserialize<T>(json, options);
Looking for other extensions?
Check the following
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net7.0 is compatible. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
-
net7.0
- No dependencies.
NuGet packages (3)
Showing the top 3 NuGet packages that depend on Weknow.Text.Json.Extensions:
Package | Downloads |
---|---|
Weknow.EventSource.Backbone.Contracts
Package Description |
|
Weknow.EventSource.Backbone.Channels.RedisProvider.Common
Package Description |
|
Weknow.EventSource.Backbone.Channels.S3StoreProvider.Common
Package Description |
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
5.1.50 | 1,524 | 2/16/2023 |
5.1.49 | 1,517 | 1/23/2023 |
5.1.48 | 291 | 1/22/2023 |
5.1.47 | 2,446 | 12/19/2022 |
5.1.46 | 1,032 | 11/15/2022 |
5.1.44 | 19,110 | 9/24/2022 |
5.1.43 | 14,713 | 4/12/2022 |
5.1.42 | 437 | 4/12/2022 |
5.1.41 | 458 | 4/12/2022 |
5.1.40 | 444 | 3/16/2022 |
5.1.39 | 2,104 | 3/16/2022 |
5.1.38 | 2,167 | 3/10/2022 |
5.1.37 | 7,091 | 3/10/2022 |
5.1.36 | 430 | 3/10/2022 |
5.1.35 | 2,145 | 3/10/2022 |
5.1.34 | 467 | 3/10/2022 |
5.1.21 | 13,663 | 3/2/2022 |
5.1.20 | 2,157 | 3/2/2022 |
5.1.18 | 10,337 | 1/17/2022 |
5.1.17 | 2,426 | 1/13/2022 |
5.1.16 | 5,220 | 1/6/2022 |
5.1.15 | 11,175 | 12/28/2021 |
5.1.14 | 1,183 | 12/28/2021 |
5.1.13 | 8,138 | 11/28/2021 |
5.1.9 | 1,864 | 11/28/2021 |
5.1.8 | 14,626 | 11/17/2021 |
5.1.7 | 278 | 11/17/2021 |
5.1.6 | 8,256 | 11/9/2021 |
5.1.5 | 2,099 | 11/8/2021 |
5.1.4 | 1,292 | 11/8/2021 |
5.1.3 | 339 | 11/8/2021 |
5.1.2 | 326 | 11/8/2021 |
5.1.1 | 1,204 | 11/8/2021 |
5.0.14 | 1,253 | 11/7/2021 |
5.0.13 | 364 | 11/3/2021 |
5.0.12 | 2,122 | 11/3/2021 |
5.0.11 | 705 | 8/9/2021 |
5.0.10 | 323 | 8/9/2021 |
5.0.9 | 349 | 8/9/2021 |
5.0.8 | 39,217 | 3/24/2021 |
5.0.7 | 387 | 3/9/2021 |
1.0.7 | 609 | 9/3/2020 |
1.0.6 | 451 | 9/3/2020 |
1.0.5 | 625 | 8/2/2020 |
1.0.4 | 515 | 8/2/2020 |
1.0.3 | 571 | 6/17/2020 |