Black.Beard.Jslt 1.0.117

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

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

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.366 68 11/13/2024
1.0.365 55 11/13/2024
1.0.364 62 11/12/2024
1.0.363 61 11/12/2024
1.0.362 72 11/11/2024
1.0.361 69 11/11/2024
1.0.360 67 11/11/2024
1.0.359 69 11/11/2024
1.0.358 76 11/11/2024
1.0.357 67 11/11/2024
1.0.356 64 11/10/2024
1.0.355 62 11/10/2024
1.0.354 74 10/28/2024
1.0.353 72 10/28/2024
1.0.352 69 10/28/2024
1.0.351 66 10/28/2024
1.0.350 110 5/2/2024
1.0.349 93 5/2/2024
1.0.348 101 5/2/2024
1.0.347 78 5/2/2024
1.0.346 131 4/7/2024
1.0.345 119 4/7/2024
1.0.344 108 4/5/2024
1.0.343 111 4/5/2024
1.0.342 125 4/5/2024
1.0.341 106 4/5/2024
1.0.340 109 4/4/2024
1.0.339 122 4/4/2024
1.0.338 120 4/3/2024
1.0.337 133 4/3/2024
1.0.336 122 4/3/2024
1.0.335 94 4/3/2024
1.0.334 111 4/2/2024
1.0.333 102 4/2/2024
1.0.332 112 4/2/2024
1.0.331 119 4/2/2024
1.0.330 110 4/2/2024
1.0.329 103 4/2/2024
1.0.328 125 4/1/2024
1.0.327 107 4/1/2024
1.0.325 106 4/1/2024
1.0.324 119 4/1/2024
1.0.323 113 4/1/2024
1.0.322 101 3/31/2024
1.0.321 106 3/31/2024
1.0.319 115 3/31/2024
1.0.318 107 3/31/2024
1.0.317 257 3/19/2024
1.0.316 111 3/19/2024
1.0.315 208 3/15/2024
1.0.314 130 3/15/2024
1.0.313 146 3/13/2024
1.0.312 130 3/13/2024
1.0.311 124 3/13/2024
1.0.310 119 3/13/2024
1.0.309 163 3/12/2024
1.0.308 178 3/12/2024
1.0.306 292 3/5/2024
1.0.305 118 3/5/2024
1.0.304 136 3/4/2024
1.0.303 121 3/4/2024
1.0.302 125 3/4/2024
1.0.301 116 3/4/2024
1.0.300 144 3/3/2024
1.0.299 108 3/3/2024
1.0.298 279 2/26/2024
1.0.297 120 2/26/2024
1.0.296 118 2/25/2024
1.0.295 118 2/25/2024
1.0.294 128 2/24/2024
1.0.293 114 2/24/2024
1.0.292 112 2/24/2024
1.0.291 123 2/24/2024
1.0.290 110 2/24/2024
1.0.289 113 2/24/2024
1.0.288 206 2/21/2024
1.0.287 125 2/21/2024
1.0.286 1,823 12/12/2023
1.0.285 125 12/12/2023
1.0.259 1,544 10/17/2023
1.0.258 128 10/17/2023
1.0.257 237 10/13/2023
1.0.256 137 10/13/2023
1.0.255 233 10/10/2023
1.0.254 145 10/10/2023
1.0.253 184 9/19/2023
1.0.252 132 9/19/2023
1.0.251 156 9/13/2023
1.0.250 148 9/13/2023
1.0.245 180 7/26/2023
1.0.244 165 7/26/2023
1.0.243 181 7/19/2023
1.0.242 173 7/19/2023
1.0.241 150 7/11/2023
1.0.240 160 7/11/2023
1.0.239 161 7/7/2023
1.0.238 148 7/7/2023
1.0.237 174 7/6/2023
1.0.236 158 7/6/2023
1.0.235 151 7/6/2023
1.0.234 159 7/6/2023
1.0.232 152 7/5/2023
1.0.231 162 7/5/2023
1.0.230 178 7/5/2023
1.0.229 170 7/5/2023
1.0.228 158 7/5/2023
1.0.227 164 7/5/2023
1.0.226 162 7/4/2023
1.0.225 153 7/4/2023
1.0.224 184 7/3/2023
1.0.223 156 7/3/2023
1.0.222 159 6/30/2023
1.0.221 140 6/30/2023
1.0.220 164 6/30/2023
1.0.219 152 6/30/2023
1.0.218 183 6/17/2023
1.0.217 162 6/17/2023
1.0.214 164 6/6/2023
1.0.213 154 6/6/2023
1.0.212 154 6/6/2023
1.0.211 152 6/6/2023
1.0.206 149 6/5/2023
1.0.205 148 6/5/2023
1.0.204 171 6/2/2023
1.0.203 138 6/2/2023
1.0.202 166 6/2/2023
1.0.201 161 6/2/2023
1.0.190 578 5/27/2022
1.0.189 525 5/27/2022
1.0.188 537 5/23/2022
1.0.187 546 5/23/2022
1.0.186 507 5/18/2022
1.0.185 509 5/18/2022
1.0.184 550 5/18/2022
1.0.183 551 5/18/2022
1.0.182 551 5/17/2022
1.0.181 542 5/17/2022
1.0.180 536 5/11/2022
1.0.179 546 5/11/2022
1.0.178 559 5/6/2022
1.0.177 560 5/6/2022
1.0.176 587 4/2/2022
1.0.175 564 4/2/2022
1.0.174 555 3/24/2022
1.0.173 544 3/24/2022
1.0.172 502 3/23/2022
1.0.171 536 3/23/2022
1.0.170 528 3/23/2022
1.0.169 524 3/23/2022
1.0.168 566 3/21/2022
1.0.167 554 3/21/2022
1.0.166 556 3/19/2022
1.0.165 573 3/19/2022
1.0.164 544 3/17/2022
1.0.163 546 3/17/2022
1.0.162 543 3/17/2022
1.0.161 562 3/17/2022
1.0.160 543 3/16/2022
1.0.159 566 3/16/2022
1.0.158 567 3/7/2022
1.0.157 565 3/7/2022
1.0.156 554 3/6/2022
1.0.155 553 3/6/2022
1.0.154 568 3/6/2022
1.0.153 568 3/6/2022
1.0.152 563 3/6/2022
1.0.151 568 3/6/2022
1.0.150 561 3/6/2022
1.0.149 581 3/6/2022
1.0.148 578 3/5/2022
1.0.147 571 3/5/2022
1.0.146 525 3/5/2022
1.0.145 676 3/5/2022
1.0.144 667 3/5/2022
1.0.143 682 3/5/2022
1.0.142 665 3/5/2022
1.0.140 566 3/5/2022
1.0.139 547 3/5/2022
1.0.137 550 3/5/2022
1.0.136 532 3/5/2022
1.0.135 424 3/5/2022
1.0.134 426 3/5/2022
1.0.133 560 3/5/2022
1.0.132 564 3/5/2022
1.0.131 548 3/5/2022
1.0.130 573 3/5/2022
1.0.128 550 3/5/2022
1.0.126 425 3/5/2022
1.0.125 450 3/4/2022
1.0.124 447 3/4/2022
1.0.123 448 3/4/2022
1.0.122 457 3/4/2022
1.0.120 457 3/4/2022
1.0.119 443 3/4/2022
1.0.118 433 3/3/2022
1.0.117 427 3/3/2022
1.0.116 425 3/3/2022
1.0.115 448 3/3/2022
1.0.114 454 2/21/2022
1.0.113 432 2/21/2022
1.0.112 467 2/19/2022
1.0.111 428 2/18/2022
1.0.110 442 2/18/2022
1.0.109 438 2/18/2022
1.0.107 431 2/17/2022
1.0.106 965 2/17/2022
1.0.105 474 1/18/2022
1.0.104 466 1/18/2022
1.0.103 304 12/20/2021
1.0.102 308 12/20/2021
1.0.101 293 12/20/2021
1.0.100 288 12/20/2021
1.0.99 275 12/20/2021
1.0.98 260 12/20/2021
1.0.96 292 12/18/2021
1.0.94 334 12/18/2021
1.0.93 310 12/18/2021
1.0.92 327 12/18/2021
1.0.0 446 3/5/2022