<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Faraz Ahmed</title>
    <description>The latest articles on DEV Community by Faraz Ahmed (@farazahmed614).</description>
    <link>https://dev.to/farazahmed614</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4224994%2Fd734b60c-e4da-4a80-85a8-005c9c363c40.png</url>
      <title>DEV Community: Faraz Ahmed</title>
      <link>https://dev.to/farazahmed614</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/farazahmed614"/>
    <language>en</language>
    <item>
      <title>We Open Sourced Our Core .NET JSON Data Mapping Engine (MIT Licensed)</title>
      <dc:creator>Faraz Ahmed</dc:creator>
      <pubDate>Fri, 06 Nov 2026 19:32:19 +0000</pubDate>
      <link>https://dev.to/farazahmed614/we-open-sourced-our-core-net-json-data-mapping-engine-mit-licensed-1fpf</link>
      <guid>https://dev.to/farazahmed614/we-open-sourced-our-core-net-json-data-mapping-engine-mit-licensed-1fpf</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fux0xjwnljgwcupyvoaqk.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fux0xjwnljgwcupyvoaqk.jpg" alt="mapping image" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hey DEV! 👋&lt;/p&gt;

&lt;p&gt;If you build web apps or data pipelines, you know the pain of writing repetitive, imperative code just to map one shape of JSON into another. &lt;/p&gt;

&lt;p&gt;Today, we are incredibly excited to share that we have open-sourced the core engine behind &lt;strong&gt;&lt;a href="https://spanflow.app" rel="noopener noreferrer"&gt;SpanFlow&lt;/a&gt;&lt;/strong&gt;'s visual pipelines. The same engine that branches, loops, and merges JSON payloads in our cloud platform is now entirely open for you to run locally, embed in your own projects, or self-host.&lt;/p&gt;

&lt;p&gt;Here is what we've open-sourced and how you can get started right now.&lt;/p&gt;




&lt;h3&gt;
  
  
  📦 1. Embed the Engine in your .NET Apps
&lt;/h3&gt;

&lt;p&gt;The engine libraries are fully &lt;strong&gt;MIT-licensed&lt;/strong&gt; and target &lt;code&gt;.NET Standard 2.0&lt;/code&gt;, &lt;code&gt;.NET 8&lt;/code&gt;, &lt;code&gt;.NET 9&lt;/code&gt;, and &lt;code&gt;.NET 10&lt;/code&gt;. This means it runs effortlessly on modern .NET as well as legacy &lt;code&gt;.NET Framework 4.7.2+&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To run JSON-to-JSON visual mappings directly inside your own C# backend code, just pull down the NuGet packages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Contains the schema model and transformation validation rules&lt;/span&gt;
dotnet add package SpanFlow.Mapping.Core

&lt;span class="c"&gt;# The execution engine that performs the transformations&lt;/span&gt;
dotnet add package SpanFlow.Mapping.Engine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Executing a visual mapping model takes only a few lines of code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Text.Json&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Text.Json.Nodes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;SpanFlow.Mapping.Core.Models&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;SpanFlow.Mapping.Engine&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Read and deserialize your pre-defined mapping JSON schema&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;JsonSerializerOptions&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;PropertyNameCaseInsensitive&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;mapping&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;JsonSerializer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Deserialize&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;MappingDefinition&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ReadAllText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"mapping.json"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)!;&lt;/span&gt;

&lt;span class="c1"&gt;// Parse your raw input payload&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;JsonNode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ReadAllText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"input.json"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="c1"&gt;// Execute the transformation engine&lt;/span&gt;
&lt;span class="n"&gt;JsonNode&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;MappingEngine&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;Execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mapping&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Outputs the cleanly transformed JSON structure&lt;/span&gt;
&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToJsonString&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🐳 2. Run the Visual Designer Locally via Docker
&lt;/h3&gt;

&lt;p&gt;We didn’t just open-source the console engine—we also packed up the drag-and-drop UI. You can run the entire hosted mapping studio layout on your local machine using a single Docker container. &lt;/p&gt;

&lt;p&gt;No databases, no external dependencies, and absolutely no sign-in screens required.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:8080 ghcr.io/spanflow/mapping-designer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once running, spin up your browser to &lt;code&gt;http://localhost:8080&lt;/code&gt; to visually draw nodes, trace inputs/outputs, and manage pipelines locally. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Note: The core engine libraries are MIT licensed; the designer API and front-end interface are licensed under the Functional Source License, which rolls over into Apache 2.0 after two years).&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  🎮 3. Test It Online Instantly (No Install)
&lt;/h3&gt;

&lt;p&gt;If you just want to see how the engine behaves under the hood without adding dependencies or spinning up containers, we've set up a completely free, no-auth web playground.&lt;/p&gt;

&lt;p&gt;You can paste a raw snippet of your target payload, draw your logic nodes, and watch your transformations run dynamically:&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;&lt;a href="https://mapping.spanflow.app" rel="noopener noreferrer"&gt;Open the SpanFlow Mapping Playground&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can also programmatically test the playground's sandbox endpoints by executing a direct &lt;code&gt;POST&lt;/code&gt; to the hosted mapping execution API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://spanflow.app &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "mapping": {
      "target": {
        "type": "object",
        "mappings": [
          { "target": "employeeId", "from": "input.id" },
          { "target": "name", "from": "input.fullName" }
        ]
      }
    },
    "inputObject": {
      "id": 101,
      "fullName": "Alice Smith"
    }
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  💻 Open for Contributions
&lt;/h3&gt;

&lt;p&gt;We’d love to know what you think! You can explore the internal architecture, report tracking bugs, submit features, or browse our engine tests directly over on GitHub:&lt;/p&gt;

&lt;p&gt;🐙 &lt;strong&gt;&lt;a href="https://github.com/SpanFlow/spanflow" rel="noopener noreferrer"&gt;Check out the SpanFlow GitHub Repository&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Drop a comment below if you have any questions about embedding it into your &lt;code&gt;.NET&lt;/code&gt; architectures, or if there are specific complex JSON mapping scenarios you want us to write recipes for!&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
