JsonApiSerializer 0.10.0
See the version list below for details.
dotnet add package JsonApiSerializer --version 0.10.0
NuGet\Install-Package JsonApiSerializer -Version 0.10.0
<PackageReference Include="JsonApiSerializer" Version="0.10.0" />
paket add JsonApiSerializer --version 0.10.0
#r "nuget: JsonApiSerializer, 0.10.0"
// 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());
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);
Links
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 |
-
.NETFramework 4.5
- Newtonsoft.Json (>= 10.0.3)
-
.NETStandard 1.0
- NETStandard.Library (>= 1.6.1)
- Newtonsoft.Json (>= 10.0.3)
-
.NETStandard 1.5
- NETStandard.Library (>= 1.6.1)
- Newtonsoft.Json (>= 10.0.3)
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 |