Black.Beard.Jslt 1.0.114

There is a newer version of this package available.
See the version list below for details.
dotnet add package Black.Beard.Jslt --version 1.0.114                
NuGet\Install-Package Black.Beard.Jslt -Version 1.0.114                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Black.Beard.Jslt" Version="1.0.114" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Black.Beard.Jslt --version 1.0.114                
#r "nuget: Black.Beard.Jslt, 1.0.114"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Black.Beard.Jslt as a Cake Addin
#addin nuget:?package=Black.Beard.Jslt&version=1.0.114

// Install Black.Beard.Jslt as a Cake Tool
#tool nuget:?package=Black.Beard.Jslt&version=1.0.114                

jslt (json Stylesheet Language Transformations)

Build status

Implementation of jslt language in DOTNET. Use a template for transform Json To another json. Consider the following template. note this template is a json that describe the structure of the target json. If the template is empty, the process return the initial source json.

Case 1

For the template document

    { "n" : "name1" }

The result will be.

    { "name" : "name1" }

In this case the result is exactly what you have in the template, because you have not used any operations of transformation.

Case 2

In this case, the value is a json path. Json path is a query language for JSON, similar to XPath for XML. The implementation of JsonPath is did by newtonsoft. [SelectToken] by the method (https://www.newtonsoft.com/json/help/html/SelectToken.htm).

    { "name" : "$.n" }

The result will be an object with a property named "name" and the value will be the properties "n" at the root of the source json. The value '$..n' is a valid json path implemented by newtonsoft.

Case 3

you can use functions for extend the process.

Like that

    "property name": .mymethod( "$.property", arg2, ...)

'mymethod' is the name of the service you want to call. The sdk provide another keys like sum or distinct. the list is available here. If you write your own method, you must register the methods before in the configuration. the arguments must be any json part (see the directives for register your extension).

A sample for call the method

// Source
{ "prices": [{"n" : 1}, {"n" : 2}, {"n" : 3}] }

// Template
{ "prices": .sum("$..n") } // sum method is a service registered in the services list.

// Result
{ "prices":  6 }

Note

if the string start with '$' the value is automatically convert in json path. if the method expect a string you must cast the value.

{ "prices": .method("$..n" @string) } 

cast

for cast a value you must use this syntax '@type'

  • @uri
  • @time
  • @datetime
  • @string
  • @guid
  • @integer
  • @decimal

Custom services

the customs services are used to extend the feature of the Sdk. You can create your own customs services.

That is the skeleton

[JsltExtensionMethod("method1")] // name of the method in the template
public static JToken ExtendTheSdkMethod1(RuntimeContext ctx)
{
    return new JValue("result");
}

I give you the method loadjson like sample

[JsltExtensionMethod("loadjson")] // name of the method in the template
[JsltExtensionMethodParameter("sourcePath", "directory source path")] // Provide intellisense in the code editor.
public static JToken ExecuteLoadSource(RuntimeContext ctx, string sourcePath)
{

    // Use the system for resolve the file with path relative to the current template script.
    var file = ctx.Configuration.ResolveFile(sourcePath);

    if (file.Exists)
        return file.FullName
            .LoadContentFromFile()
            .ConvertToJson();
        else
        {
            ctx.Diagnostics.AddDiagnostic(Parser.SeverityEnum.Warning, string.Empty, new Parser.TokenLocation(), "file.FullName", $"file '{file.FullName}' not found");
        }

    return JValue.CreateNull();

}

Note, that you can add any parameter.

Disclaimer

If you use a easy treatement, the template is a valid json structure. If you want do more the json syntax become verbose. It is for this reason I have extended the json syntax.

when

the method when is very usefull. it is a switch case.

{
    "prices": .when("$.prop1" @string) 
    {
        "case1": { /* structure to inject if the value of '$.prop1' is equal to 'case1' */ }
    }
} 

How to use

Command line

You can use the command line json.exe. Documentation of json cli.

By code

// Intialization of the configuration
var configuration = new TranformJsonAstConfiguration()
{
    OutputPath = Environment.CurrentDirectory,
};

// add a custom service : Note the services in the sdk are already registered
configuration.Services.ServiceDiscovery.AddService("serviceName", typeof(service));
// if you want to implement your service : use and implemente the interface Bb.Json.Jslt.Services.ITransformJsonService                

TemplateTransformProvider Templateprovider = new TemplateTransformProvider(configuration);

//Build the template translator
StringBuilder sbPayloadTemplate = new StringBuilder(@"payload template");
JsltTemplate template = Templateprovider.GetTemplate(sbPayloadTemplate, false, "name of the template file");


// now the source json
// from text
var source1 = SourceJson.GetFromText("payload");
// from file
var source2 = SourceJson.GetFromFile("filename");
// from json
var source3 = SourceJson.GetFromJson(new JObject());

// Create the sources object with the primary source of data
var src = new Sources(source1);
// you can add additional source of datas
src.Add(source2);
src.Add(source3);

RuntimeContext ctx = template.Transform(src);
var result = ctx.TokenResult;

JSONPath notation

A JSONPath expression specifies a path to an element (or a set of elements) in a JSON structure. Paths can use the dot notation: The implementation is provided by newtonsoft.

Documentation of json path

Custom services embedded in the Sdk

Documentation of the Services

Directives of compilation

You can manage any directives

Sample

"$directives":
{
   "culture":"FR-fr",
   "assemblies":["assembly name referenced in the gac"],
   "functions":["path of the csharp file"],
   "packages":["path of the package on nuget.org"],
   "imports": ["path of the assembly flie"],
   "output": 
   {
       "filter": "$.datas", // It is json path for filter just one part of the output document
       "Mode": .to_block()  // Behavior the output serialization
   }
}   

culture

Set the culture of the process. The Culture specifies a unique name for each culture, based on RFC 4646. The name is a combination of an ISO 639 two-letter lowercase culture code associated with a language and an ISO 3166 two-letter uppercase subculture code associated with a country or region. In addition, for apps that target .NET Framework 4 or later and are running under Windows 10 or later, culture names that correspond to valid BCP-47 language tags are supported.

imports

Take a list of assemblies files. the path is relative to the json template file.

assemblies

Take a list of assemblies name referenced in the GAC.

Functions

Take a list of c# source code file. the path is relative to the json template file. The file contains Csharp source code like this class see the DistinctService like sample

Packages

You can use

"$directives":
{
   "packages": ["path of the assembly file on nuget"],
}

// or 

"$directives":
{
   "packages": [ ["https://www.nuget.org/api/v2/package/", "path of the assembly file"] ],
}

output

the output manage the serialization

Filter

Select just a part of the output document

Mode

Mode is a function that serialize the output document.

to_block()

If the output is an array all lines are serialized (one object by line)

to_json(bool indented, bool ignoreNullAndEmptyValues)

serialize the output in classical serialization

You can write your own serialize service. The returned type must be a StringBuilder


[JsltExtensionMethod("to_block", ForOutput = true)]
public static StringBuilder ExecuteToBlock(RuntimeContext ctx)
{

    var source = ctx.TokenResult;
    var result = new StringBuilder();

    if (source is JObject o)
        result.AppendLine(o.ToString(Newtonsoft.Json.Formatting.None));

    else if (source is JArray a)    
        foreach (var item in a)
            result.AppendLine(item.ToString(Newtonsoft.Json.Formatting.None));
    
    return result;

}

Product Compatible and additional computed target framework versions.
.NET net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (2)

Showing the top 2 NuGet packages that depend on Black.Beard.Jslt:

Package Downloads
Black.Beard.Jslt.Services

support extended method(loading excel, html, multicsv, sql).

Black.Beard.Jslt.Symbol

Implementation of jslt language in DOTNET. Use a template for transform Json document to another json document.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.0.374 93 12/7/2024
1.0.373 89 12/7/2024
1.0.372 95 11/20/2024
1.0.371 76 11/20/2024
1.0.370 81 11/16/2024
1.0.369 78 11/16/2024
1.0.368 95 11/14/2024
1.0.367 81 11/14/2024
1.0.366 89 11/13/2024
1.0.365 77 11/13/2024
1.0.364 91 11/12/2024
1.0.363 89 11/12/2024
1.0.362 99 11/11/2024
1.0.361 91 11/11/2024
1.0.360 89 11/11/2024
1.0.359 90 11/11/2024
1.0.358 102 11/11/2024
1.0.357 88 11/11/2024
1.0.356 92 11/10/2024
1.0.355 88 11/10/2024
1.0.354 93 10/28/2024
1.0.353 85 10/28/2024
1.0.352 82 10/28/2024
1.0.351 83 10/28/2024
1.0.350 117 5/2/2024
1.0.349 100 5/2/2024
1.0.348 108 5/2/2024
1.0.347 87 5/2/2024
1.0.346 138 4/7/2024
1.0.345 126 4/7/2024
1.0.344 115 4/5/2024
1.0.343 119 4/5/2024
1.0.342 132 4/5/2024
1.0.341 115 4/5/2024
1.0.340 118 4/4/2024
1.0.339 133 4/4/2024
1.0.338 127 4/3/2024
1.0.337 140 4/3/2024
1.0.336 129 4/3/2024
1.0.335 103 4/3/2024
1.0.334 118 4/2/2024
1.0.333 110 4/2/2024
1.0.332 119 4/2/2024
1.0.331 126 4/2/2024
1.0.330 121 4/2/2024
1.0.329 111 4/2/2024
1.0.328 134 4/1/2024
1.0.327 116 4/1/2024
1.0.325 113 4/1/2024
1.0.324 126 4/1/2024
1.0.323 120 4/1/2024
1.0.322 112 3/31/2024
1.0.321 122 3/31/2024
1.0.319 124 3/31/2024
1.0.318 114 3/31/2024
1.0.317 267 3/19/2024
1.0.316 120 3/19/2024
1.0.315 215 3/15/2024
1.0.314 139 3/15/2024
1.0.313 155 3/13/2024
1.0.312 139 3/13/2024
1.0.311 131 3/13/2024
1.0.310 126 3/13/2024
1.0.309 172 3/12/2024
1.0.308 185 3/12/2024
1.0.306 299 3/5/2024
1.0.305 125 3/5/2024
1.0.304 147 3/4/2024
1.0.303 128 3/4/2024
1.0.302 132 3/4/2024
1.0.301 127 3/4/2024
1.0.300 156 3/3/2024
1.0.299 117 3/3/2024
1.0.298 286 2/26/2024
1.0.297 131 2/26/2024
1.0.296 129 2/25/2024
1.0.295 126 2/25/2024
1.0.294 135 2/24/2024
1.0.293 123 2/24/2024
1.0.292 119 2/24/2024
1.0.291 130 2/24/2024
1.0.290 121 2/24/2024
1.0.289 122 2/24/2024
1.0.288 213 2/21/2024
1.0.287 133 2/21/2024
1.0.286 1,830 12/12/2023
1.0.285 132 12/12/2023
1.0.259 1,550 10/17/2023
1.0.258 134 10/17/2023
1.0.257 243 10/13/2023
1.0.256 143 10/13/2023
1.0.255 239 10/10/2023
1.0.254 152 10/10/2023
1.0.253 191 9/19/2023
1.0.252 139 9/19/2023
1.0.251 163 9/13/2023
1.0.250 154 9/13/2023
1.0.245 186 7/26/2023
1.0.244 171 7/26/2023
1.0.243 188 7/19/2023
1.0.242 179 7/19/2023
1.0.241 156 7/11/2023
1.0.240 168 7/11/2023
1.0.239 167 7/7/2023
1.0.238 155 7/7/2023
1.0.237 182 7/6/2023
1.0.236 164 7/6/2023
1.0.235 157 7/6/2023
1.0.234 168 7/6/2023
1.0.232 158 7/5/2023
1.0.231 169 7/5/2023
1.0.230 184 7/5/2023
1.0.229 176 7/5/2023
1.0.228 164 7/5/2023
1.0.227 170 7/5/2023
1.0.226 171 7/4/2023
1.0.225 161 7/4/2023
1.0.224 193 7/3/2023
1.0.223 162 7/3/2023
1.0.222 165 6/30/2023
1.0.221 147 6/30/2023
1.0.220 170 6/30/2023
1.0.219 158 6/30/2023
1.0.218 194 6/17/2023
1.0.217 170 6/17/2023
1.0.214 172 6/6/2023
1.0.213 160 6/6/2023
1.0.212 162 6/6/2023
1.0.211 158 6/6/2023
1.0.206 158 6/5/2023
1.0.205 156 6/5/2023
1.0.204 179 6/2/2023
1.0.203 146 6/2/2023
1.0.202 172 6/2/2023
1.0.201 169 6/2/2023
1.0.190 587 5/27/2022
1.0.189 535 5/27/2022
1.0.188 548 5/23/2022
1.0.187 556 5/23/2022
1.0.186 515 5/18/2022
1.0.185 517 5/18/2022
1.0.184 558 5/18/2022
1.0.183 563 5/18/2022
1.0.182 563 5/17/2022
1.0.181 552 5/17/2022
1.0.180 546 5/11/2022
1.0.179 554 5/11/2022
1.0.178 567 5/6/2022
1.0.177 570 5/6/2022
1.0.176 596 4/2/2022
1.0.175 575 4/2/2022
1.0.174 563 3/24/2022
1.0.173 552 3/24/2022
1.0.172 512 3/23/2022
1.0.171 544 3/23/2022
1.0.170 536 3/23/2022
1.0.169 534 3/23/2022
1.0.168 574 3/21/2022
1.0.167 564 3/21/2022
1.0.166 564 3/19/2022
1.0.165 583 3/19/2022
1.0.164 554 3/17/2022
1.0.163 556 3/17/2022
1.0.162 553 3/17/2022
1.0.161 570 3/17/2022
1.0.160 551 3/16/2022
1.0.159 574 3/16/2022
1.0.158 577 3/7/2022
1.0.157 575 3/7/2022
1.0.156 564 3/6/2022
1.0.155 565 3/6/2022
1.0.154 576 3/6/2022
1.0.153 578 3/6/2022
1.0.152 571 3/6/2022
1.0.151 578 3/6/2022
1.0.150 571 3/6/2022
1.0.149 591 3/6/2022
1.0.148 589 3/5/2022
1.0.147 579 3/5/2022
1.0.146 533 3/5/2022
1.0.145 684 3/5/2022
1.0.144 675 3/5/2022
1.0.143 690 3/5/2022
1.0.142 673 3/5/2022
1.0.140 574 3/5/2022
1.0.139 555 3/5/2022
1.0.137 560 3/5/2022
1.0.136 542 3/5/2022
1.0.135 432 3/5/2022
1.0.134 434 3/5/2022
1.0.133 568 3/5/2022
1.0.132 573 3/5/2022
1.0.131 557 3/5/2022
1.0.130 582 3/5/2022
1.0.128 559 3/5/2022
1.0.126 434 3/5/2022
1.0.125 459 3/4/2022
1.0.124 455 3/4/2022
1.0.123 458 3/4/2022
1.0.122 465 3/4/2022
1.0.120 465 3/4/2022
1.0.119 453 3/4/2022
1.0.118 442 3/3/2022
1.0.117 435 3/3/2022
1.0.116 433 3/3/2022
1.0.115 456 3/3/2022
1.0.114 465 2/21/2022
1.0.113 440 2/21/2022
1.0.112 476 2/19/2022
1.0.111 437 2/18/2022
1.0.110 450 2/18/2022
1.0.109 446 2/18/2022
1.0.107 441 2/17/2022
1.0.106 1,032 2/17/2022
1.0.105 482 1/18/2022
1.0.104 474 1/18/2022
1.0.103 313 12/20/2021
1.0.102 317 12/20/2021
1.0.101 301 12/20/2021
1.0.100 296 12/20/2021
1.0.99 283 12/20/2021
1.0.98 268 12/20/2021
1.0.96 301 12/18/2021
1.0.94 345 12/18/2021
1.0.93 318 12/18/2021
1.0.92 335 12/18/2021
1.0.0 454 3/5/2022