Black.Beard.Jslt 1.0.112

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.112                
NuGet\Install-Package Black.Beard.Jslt -Version 1.0.112                
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.112" />                
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.112                
#r "nuget: Black.Beard.Jslt, 1.0.112"                
#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.112

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

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 87 12/7/2024
1.0.373 87 12/7/2024
1.0.372 93 11/20/2024
1.0.371 74 11/20/2024
1.0.370 79 11/16/2024
1.0.369 77 11/16/2024
1.0.368 94 11/14/2024
1.0.367 80 11/14/2024
1.0.366 88 11/13/2024
1.0.365 76 11/13/2024
1.0.364 88 11/12/2024
1.0.363 88 11/12/2024
1.0.362 96 11/11/2024
1.0.361 90 11/11/2024
1.0.360 88 11/11/2024
1.0.359 89 11/11/2024
1.0.358 99 11/11/2024
1.0.357 87 11/11/2024
1.0.356 90 11/10/2024
1.0.355 86 11/10/2024
1.0.354 92 10/28/2024
1.0.353 84 10/28/2024
1.0.352 81 10/28/2024
1.0.351 80 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 116 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 114 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 110 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 265 3/19/2024
1.0.316 118 3/19/2024
1.0.315 215 3/15/2024
1.0.314 137 3/15/2024
1.0.313 155 3/13/2024
1.0.312 137 3/13/2024
1.0.311 131 3/13/2024
1.0.310 126 3/13/2024
1.0.309 170 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 129 2/26/2024
1.0.296 125 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 159 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 156 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 167 6/2/2023
1.0.190 585 5/27/2022
1.0.189 533 5/27/2022
1.0.188 546 5/23/2022
1.0.187 552 5/23/2022
1.0.186 513 5/18/2022
1.0.185 515 5/18/2022
1.0.184 556 5/18/2022
1.0.183 561 5/18/2022
1.0.182 561 5/17/2022
1.0.181 550 5/17/2022
1.0.180 542 5/11/2022
1.0.179 552 5/11/2022
1.0.178 565 5/6/2022
1.0.177 566 5/6/2022
1.0.176 594 4/2/2022
1.0.175 571 4/2/2022
1.0.174 561 3/24/2022
1.0.173 550 3/24/2022
1.0.172 508 3/23/2022
1.0.171 542 3/23/2022
1.0.170 534 3/23/2022
1.0.169 530 3/23/2022
1.0.168 572 3/21/2022
1.0.167 560 3/21/2022
1.0.166 562 3/19/2022
1.0.165 581 3/19/2022
1.0.164 550 3/17/2022
1.0.163 554 3/17/2022
1.0.162 549 3/17/2022
1.0.161 568 3/17/2022
1.0.160 549 3/16/2022
1.0.159 572 3/16/2022
1.0.158 573 3/7/2022
1.0.157 573 3/7/2022
1.0.156 562 3/6/2022
1.0.155 563 3/6/2022
1.0.154 574 3/6/2022
1.0.153 574 3/6/2022
1.0.152 569 3/6/2022
1.0.151 574 3/6/2022
1.0.150 569 3/6/2022
1.0.149 589 3/6/2022
1.0.148 587 3/5/2022
1.0.147 577 3/5/2022
1.0.146 531 3/5/2022
1.0.145 682 3/5/2022
1.0.144 673 3/5/2022
1.0.143 688 3/5/2022
1.0.142 671 3/5/2022
1.0.140 572 3/5/2022
1.0.139 553 3/5/2022
1.0.137 556 3/5/2022
1.0.136 540 3/5/2022
1.0.135 430 3/5/2022
1.0.134 432 3/5/2022
1.0.133 566 3/5/2022
1.0.132 571 3/5/2022
1.0.131 555 3/5/2022
1.0.130 580 3/5/2022
1.0.128 557 3/5/2022
1.0.126 432 3/5/2022
1.0.125 457 3/4/2022
1.0.124 453 3/4/2022
1.0.123 456 3/4/2022
1.0.122 463 3/4/2022
1.0.120 463 3/4/2022
1.0.119 451 3/4/2022
1.0.118 440 3/3/2022
1.0.117 433 3/3/2022
1.0.116 431 3/3/2022
1.0.115 454 3/3/2022
1.0.114 463 2/21/2022
1.0.113 438 2/21/2022
1.0.112 474 2/19/2022
1.0.111 435 2/18/2022
1.0.110 448 2/18/2022
1.0.109 444 2/18/2022
1.0.107 439 2/17/2022
1.0.106 1,030 2/17/2022
1.0.105 480 1/18/2022
1.0.104 472 1/18/2022
1.0.103 311 12/20/2021
1.0.102 315 12/20/2021
1.0.101 299 12/20/2021
1.0.100 294 12/20/2021
1.0.99 281 12/20/2021
1.0.98 266 12/20/2021
1.0.96 299 12/18/2021
1.0.94 343 12/18/2021
1.0.93 316 12/18/2021
1.0.92 333 12/18/2021
1.0.0 452 3/5/2022