JsonApiSerializer 0.10.0

.NET Standard 1.0 .NET Framework 4.5
There is a newer version of this package available.
See the version list below for details.
dotnet add package JsonApiSerializer --version 0.10.0
NuGet\Install-Package JsonApiSerializer -Version 0.10.0
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="JsonApiSerializer" Version="0.10.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add JsonApiSerializer --version 0.10.0
#r "nuget: JsonApiSerializer, 0.10.0"
#r directive can be used in F# Interactive, C# scripting and .NET Interactive. Copy this into the interactive tool or source code of the script to reference the package.
// Install JsonApiSerializer as a Cake Addin
#addin nuget:?package=JsonApiSerializer&version=0.10.0

// Install JsonApiSerializer as a Cake Tool
#tool nuget:?package=JsonApiSerializer&version=0.10.0

JsonApiSerializer

The JsonApiSerializer provides configurationless serializing and deserializing objects into the json:api format.

It is implemented as an JsonSerializerSettings for Json.Net with usage being the standard Json.Net methods passing in a JsonApiSerializerSettings

//To serialize a POCO in json:api format
string json = JsonConvert.SerializeObject(articles, new JsonApiSerializerSettings());

//To deserialize to a POCO from json:api format
Article[] articles = JsonConvert.DeserializeObject<Article[]>(json, new JsonApiSerializerSettings());

NuGet version

Example

Given an object model like:

public class Article
{
    public string Id { get; set; }

    public string Title { get; set; }

    public Person Author { get; set; }

    public List<Comment> Comments { get; set; }
}

public class Comment
{
    public string Id { get; set; }

    public string Body { get; set; }

    public Person Author { get; set; }
}

public class Person
{
    public string Id { get; set; }

    [JsonProperty(propertyName: "first-name")] //uses standard Json.NET attributes to control serialization
    public string FirstName { get; set; }

    [JsonProperty(propertyName: "last-name")]
    public string LastName { get; set; }

    public string Twitter { get; set; }
}

Deserialization

and json:api content that look something like

{
  "data": [{
    "type": "articles",
    "id": "1",
    "attributes": {
        "title": "JSON API paints my bikeshed!"
    },
    "relationships": {
      "author": {
        "data": { "type": "people", "id": "9" }
      },
      "comments": {
        "data": [
          { "type": "comments", "id": "5" },
          { "type": "comments", "id": "12" }
        ]
      }
    }
  }],
  "included": [{
    "type": "people",
    "id": "9",
    "attributes": {
      "first-name": "Dan",
      "last-name": "Gebhardt",
      "twitter": "dgeb"
    },
  }, {
    "type": "comments",
    "id": "5",
    "attributes": {
      "body": "First!"
    },
    "relationships": {
      "author": {
        "data": { "type": "people", "id": "2" }
      }
    },
  }, {
    "type": "comments",
    "id": "12",
    "attributes": {
      "body": "I like XML better"
    },
    "relationships": {
      "author": {
        "data": { "type": "people", "id": "9" }
      }
    },
  }]
}

We can deserialize with

Article[] articles = JsonConvert.DeserializeObject<Article[]>(json, new JsonApiSerializerSettings());

Serialization

We can also generate the JSON from our object model


var author = new Person
{
    Id = "9",
    FirstName = "Dan",
    LastName = "Gebhardt",
    Twitter = "dgeb",
};

var articles = new[] {
    new Article
    {
        Id = "1",
        Title = "JSON API paints my bikeshed!",
        Author = author,
        Comments = new List<Comment>
        {
            new Comment
            {
                Id = "5",
                Body = "First!",
                Author = new Person
                {
                    Id = "2"
                },
            },
            new Comment
            {
                Id = "12",
                Body = "I like XML better",
                Author = author,
            }
        }
    }
};

//will produce the same json:api json value
string json = JsonConvert.SerializeObject(articles, new JsonApiSerializerSettings());

Extracting more properties

json:api allows for additional information to be stored at objects and relationships, We provide some helper classes that allows you to access these properties.

DocumentRoot

DocumentRoot<TData> allows you to get and set json:api values at the root document level

{
	"jsonapi": {
		"version":"1.0"
	},
	"links": {
		"self": "http://example.com/articles",
	},
	"meta": {
		"created": "2017-04-02T23:28:35"
	},
	"data": [{
  		"id" : "1",
		"type": "articles",
		"attributes": {
	  		"title": "document root example"
		}
	}]
}
DocumentRoot<Article[]> articlesRoot = JsonConvert.DeserializeObject<DocumentRoot<Article[]>>(json, new JsonApiSerializerSettings());
Assert.Equal("1.0" articlesRoot.JsonApi.Version);
Assert.Equal("http://example.com/articles", articlesRoot.Links["self"].Href);
Assert.Equal("2017-04-02T23:28:35", articlesRoot.Meta["self"]["created"]);

Relationships

Relationship<TData> can be used in an object to get and set additional json:api around relationships such as links or meta

{
	"data": [{
		"type": "articles",
		"id": "1",
		"attributes": {
			"title": "JSON API paints my bikeshed!"
		},
		"relationships": {
			"author": {
				"links": {
				  "self": "http://example.com/articles/1/relationships/author",
				  "related": "http://example.com/articles/1/author"
				},
				"data": { "type": "people", "id": "9" }
			}
		}
	}]
}
public class Article
{
    public string Id { get; set; }

    public string Title { get; set; }

    public Relationship<Person> Author { get; set; }
}
Article[] articles = JsonConvert.DeserializeObject<Article[]>(json, new JsonApiSerializerSettings());
Assert.Equal("http://example.com/articles/1/relationships/author", articles[0].links["self"].Href);
Assert.Equal("http://example.com/articles/1/author", articles[0].links["related"].Href);

Link can be used to store link values. json:api supports links as either a string or as an object. JsonApiSerializer normalizes this behaviour so in the object model they are always an object.

A Links class is also provided to store a dictionary of links that is typically stored on json:api objects

Types

If you dont specify a type property on your object model JsonApiSerializer will use the class name. If you want to modify this behaviour it is as simple as putting a Type property on a class

public class Person
{
	public string Type { get; set; } = "people"; //sets type to "people"

	public string Id { get; set; }

	[JsonProperty(propertyName: "first-name")]
	public string FirstName { get; set; }

	[JsonProperty(propertyName: "last-name")]
	public string LastName { get; set; }

	public string Twitter { get; set; }
}

Determining relationship objects

By default any class with an "Id" is considered a Resource Object, and it will be treated as a relationship during serialization and deserialization.

This can be overrided during initialization by providing your own JsonConverter (it is strongly recommneded you extend ResourceObjectConverter) when you create the JsonApiSerializerSettings. Your custom 'JsonConverter can override the `CanConvert(Type type)' method.

var settings = new JsonApiSerializerSettings(new MyOwnJsonSerializer())
Article[] articles = JsonConvert.DeserializeObject<Article[]>(json, settings);
Product Versions
.NET net5.0 net5.0-windows net6.0 net6.0-android net6.0-ios net6.0-maccatalyst net6.0-macos net6.0-tvos net6.0-windows net7.0 net7.0-android net7.0-ios net7.0-maccatalyst net7.0-macos net7.0-tvos net7.0-windows
.NET Core netcoreapp1.0 netcoreapp1.1 netcoreapp2.0 netcoreapp2.1 netcoreapp2.2 netcoreapp3.0 netcoreapp3.1
.NET Standard netstandard1.0 netstandard1.1 netstandard1.2 netstandard1.3 netstandard1.4 netstandard1.5 netstandard1.6 netstandard2.0 netstandard2.1
.NET Framework net45 net451 net452 net46 net461 net462 net463 net47 net471 net472 net48
MonoAndroid monoandroid
MonoMac monomac
MonoTouch monotouch
Tizen tizen30 tizen40 tizen60
Universal Windows Platform uap uap10.0
Windows Phone wp8 wp81 wpa81
Windows Store netcore netcore45 netcore451
Xamarin.iOS xamarinios
Xamarin.Mac xamarinmac
Xamarin.TVOS xamarintvos
Xamarin.WatchOS xamarinwatchos
Compatible target framework(s)
Additional computed target framework(s)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (11)

Showing the top 5 NuGet packages that depend on JsonApiSerializer:

Package Downloads
Clinical6SDK

An easy to use .NET SDK for Clinical6 SDK (a product of Parallel6)

Pubg-DotNet

Sync and Async client library for communicating with the Pubg Developer API supporting .net standard 2.0

Xamarin.Forms.Clinical6

A library for Clinical6 UI components (a product of Parallel6)

Rethought.Battlerite.NET.Rest

This package is responsible to interact with the Battlerite REST API. Part of the Battlerite.NET library.

Xamarin.Forms.Clinical6.iOS

A library for Clinical6 UI Controls Renders (a product of Parallel6)

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.7.4 720,242 12/16/2019
1.7.3 64,914 7/17/2019
1.7.2 1,368 7/13/2019
1.7.1 825 7/13/2019
1.7.0 51,928 3/24/2019
1.6.2 12,628 1/9/2019
1.6.1 12,998 12/10/2018
1.6.0 7,056 11/26/2018
1.6.0-beta01 791 11/19/2018
1.5.1 20,815 10/31/2018
1.5.0 974 10/30/2018
1.4.0 170,202 7/15/2018
1.3.2 1,250 7/12/2018
1.3.1 34,122 4/26/2018
1.3.0 4,263 4/10/2018
1.2.3 1,434 4/2/2018
1.2.2 3,120 3/20/2018
1.2.1 10,399 3/18/2018
1.2.0 6,003 2/8/2018
1.1.0 14,656 1/4/2018
1.0.0 6,173 11/4/2017
0.10.0 1,167 11/4/2017
0.9.18 9,320 9/2/2017
0.9.16 1,978 8/2/2017
0.9.15 1,226 8/1/2017
0.9.14 1,396 7/21/2017
0.9.13 5,175 7/12/2017
0.9.11 1,386 6/6/2017
0.9.10 1,194 6/6/2017
0.9.9 1,228 5/25/2017
0.9.8 1,218 5/23/2017
0.9.7 1,238 5/17/2017
0.9.6 1,214 5/17/2017
0.9.4 1,378 4/19/2017
0.9.3 1,241 4/11/2017
0.9.2 1,218 4/10/2017
0.9.1 1,140 4/4/2017
0.9.0 1,206 4/2/2017