CypherPotato.LightJson
0.7.0
See the version list below for details.
dotnet add package CypherPotato.LightJson --version 0.7.0
NuGet\Install-Package CypherPotato.LightJson -Version 0.7.0
<PackageReference Include="CypherPotato.LightJson" Version="0.7.0" />
paket add CypherPotato.LightJson --version 0.7.0
#r "nuget: CypherPotato.LightJson, 0.7.0"
// Install CypherPotato.LightJson as a Cake Addin #addin nuget:?package=CypherPotato.LightJson&version=0.7.0 // Install CypherPotato.LightJson as a Cake Tool #tool nuget:?package=CypherPotato.LightJson&version=0.7.0
LightJson
This project was based in the awesome work of LightJson, originally made by Marcos Lopez C.
This fork includes some personal tweaks. It is a JSON library focused on not using reflection, where object mapping is made manually and does not requires defining types to serialize/deserialize JSON messages.
It also does not use Source Generators to read or write messages, which makes it possible to build code with bflat or AOT-Compilation.
Almost everything in this class is inherited from the main project mentioned above, with new features:
- Unlike the original project, a
JsonValue
does not contain anyAsType
properties, but has a method for each JSON type, likeGetString()
or evenGetNumber()
, and the main difference is that you cannot get an implicit value of what theJsonValue
is. For example, you cannot readJsonValue.GetBoolean()
if the stored value is a string, even if it's value is"true"
or0
. - All functions that return an object converted from a JsonValue, such as
JsonValue.GetString()
for example, do not return nullable values. You can check for nullable JSON values usingJsonValue.MaybeNull()
. Null values would throw an exception if not used withMaybeNull()
. - Added
JsonOptions
for the parser, which has:PropertyNameCaseInsensitive
, which indicates whether a property's name uses a case-insensitive comparison when getting values.SerializeFields
, Gets or sets whether theJsonValue.FromObject
should serialize fields or not.Converters
, which aims to manage JSON converters.NamingPolicy
, which transforms the property name of a JSON object on the JSON output.
- Undefined values, as it is, values which aren't defined or does not exist in the parent object/array, will come with
JsonValueType.Undefined
type instead ofJsonValueType.Null
. - This projects only targets .NET 6 and above.
- Experimental support for including the JSON value path into error messages.
Additionally, this library includes these new features:
Serializing objects
You can serialize anonymous objects
object anonymousObject = new
{
foo = "bar"
};
string json = JsonValue.FromObject(anonymousObject).ToString();
// {"foo":"bar"}
And objects which has their JsonConverter
defined:
string json = JsonValue.FromObject(DateTime.Now).ToString();
Also, for primitive data-types, you can serialize objects with the JsonValue
constructors. You cannot implicitly create objects in this project, as the original project does.
// ❌ error
JsonValue stringValue = "hello";
// ✅ ok
JsonValue stringValue = new JsonValue("hello");
JSON converters
Here's an example of an System.DateTime
converter, which serializes and deserializes values into it:
static void Main(string[] args)
{
JsonOptions.Mappers.Add(new DatetimeMapper());
string json = JsonValue.FromObject(DateTime.Now).ToString();
Console.WriteLine(json);
}
public class DatetimeMapper : JsonConverter
{
public override Boolean CanSerialize(Type obj)
{
return obj == typeof(DateTime);
}
public override Object Deserialize(JsonValue value, Type requestedType)
{
return DateTime.Parse(value.GetString());
}
public override JsonValue Serialize(Object value)
{
DateTime t = (DateTime)value;
return new JsonValue(t.ToString("s"));
}
}
Also, these converters are defined by default:
- DictionaryConverter, which converts
IDictionary<string, object?>
into an JsonObject, and vice-versa. - GuidConverter, which converts
System.Guid
into an string, and vice-versa. - EnumConverter which converts an enum value into it's string representation, and vice versa, enabled through
EnumConverter.EnumToString
. - DatetimeConverter which converts
System.DateTime
into string, and vice-versa, using the formatDatetimeConverter.Format
.
Fluent syntax for retrieving items
string json = """
{
"foobar": "hello",
"bazdaz": null,
"duzkaz": [
"foo",
"bar",
"daz"
],
"user": {
"name": "John McAffee", "age": 52
}
}
""";
var obj = JsonValue.Parse(json);
// $.foobar must be present, non null and carry an string value.
string stringValue = obj["foobar"].GetString();
// $.bazdaz can be null or undefined, but if not, it must be an string.
string? optionalValue = obj["bazdaz"].MaybeNull()?.GetString();
// $.duzkaz must be present, non null, be an json array and every children on it
// must be an string value.
string[] arrayItems = obj["duzkaz"].GetJsonArray().Select(i => i.GetString()).ToArray();
// $.user must be present, non null, and must be converted to the User type, which it's converter
// is defined on JsonOptions.Converters.
User user = obj["user"].Get<User>();
Product | Versions 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. |
-
net6.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
0.11.0 | 72 | 11/11/2024 |
0.10.7 | 70 | 10/25/2024 |
0.10.6 | 91 | 10/10/2024 |
0.10.5 | 94 | 9/30/2024 |
0.10.4 | 88 | 9/26/2024 |
0.10.3 | 93 | 9/26/2024 |
0.10.1 | 109 | 8/30/2024 |
0.10.0-beta4 | 85 | 8/27/2024 |
0.10.0-beta3 | 100 | 8/26/2024 |
0.10.0-beta1 | 112 | 8/23/2024 |
0.9.3 | 119 | 7/18/2024 |
0.9.2 | 113 | 7/3/2024 |
0.9.1 | 109 | 7/1/2024 |
0.9.0 | 108 | 5/28/2024 |
0.9.0-beta3 | 98 | 5/14/2024 |
0.9.0-beta2 | 108 | 5/4/2024 |
0.9.0-beta1 | 60 | 5/2/2024 |
0.8.0 | 123 | 4/4/2024 |
0.7.0 | 115 | 3/24/2024 |
0.6.0 | 138 | 1/18/2024 |
0.5.6 | 198 | 12/6/2023 |
0.5.5 | 149 | 11/30/2023 |