Json.NET 4.5 Release 4 – Portable Class Library Build

They took my dressing room, my parking space, even my writer, so I don't have a funny third item.Portable Class Library Build

Json.NET now has a Portable Class Library build that can be found in the /Bin/Portable directory from the zip download on CodePlex. The portable build targets the absolute basics (.NET 4.0, SL4, WP7, Metro) and so hopefully should run on just about everything.

Improved Collection Serialization

JsonArrayAttribute and JsonDictionaryAttribute now have properties to customize the serialization of collection items. ItemConverter, ItemTypeNameHandling, ItemReferenceLoopHandling and ItemIsReference will apply to all the items of that list/dictionary when serializing and deserializing.

Changes

  • New feature – Added Portable Class Library build
  • New feature - Added support for customizing the JsonConverter, type name handling and reference handling of collection items
  • New feature - Added Path to JsonReaderException/JsonSerializationException messages
  • New feature - Added DateParseHandling to JsonReader
  • New feature - Added JsonContainerContract
  • New feature - Added JsonDictionaryAttribute
  • Change – Instances of Exception have been changed to be a more specific exception
  • Fix – Fixed Windows Application Certification tool error by removing AllowPartiallyTrustedCallersAttribute
  • Fix - Fixed JsonWriters not using DateTimeZoneHandling

Links

Json.NET CodePlex Project

Json.NET 4.5 Release 4 Download – Json.NET source code, documentation and binaries

Json.NET 4.5 Release 2 – Serializable support and bug fixes

Serializable Support

Json.NET now detects types that have the SerializableAttribute and serializes all the fields on that type, both public and private, and ignores the properties. This is useful when you’re interested in round-tripping the data on a type and don’t care what the JSON looks like.

If you are serializing types that have the attribute and don’t want the new behaviour, it can either be overridden on a type using the JsonObjectAttribute or disabled globally by setting IgnoreSerializableAttribute on DefaultContractResolver to true.

Update: IgnoreSerializableAttribute is true by default in release 3. If you want it you can still achieve this effect by either setting IgnoreSerializableAttribute to false or adding [JsonObject(MemberSerialization.Fields)] to your class.

Bug fixes

Interesting bug fixes this release include correctly reading JSON from slow streams (e.g. a network stream that is only returning one character at a time), fixing invalid Unicode surrogate characters, and ignoring property order when comparing two JObjects (JavaScript objects aren’t ordered and so could come back serialized in a different order).

Changes

  • New feature - Added support for the SerializableAttribute and serializing a type's internal fields
  • New feature - Added MaxDepth to JsonReader/JsonSerializer/JsonSerializerSettings
  • New feature - Added support for ignoring properties with the NonSerializableAttribute
  • Fix - Fixed deserializing a null string throwing a NullReferenceException
  • Fix - Fixed JsonTextReader incorrectly reading from a slow stream
  • Fix - Fixed CultureInfo not being overridden on JsonSerializerProxy
  • Fix - Fixed full trust security check in .NET 2.0 & .NET 3.5
  • Fix - Fixed XmlNodeConverter not turning all attribute properties into attributes
  • Fix - Fixed comparing JObjects to ignore property order
  • Fix - Fixed reading invalid Unicode surrogate pairs

Links

Json.NET CodePlex Project

Json.NET 4.5 Release 2 Download – Json.NET source code, documentation and binaries

Json.NET Strong Naming and Assembly Version Numbers

In the Json.NET 4.5 release post I added a note about strong naming and assembly version numbers that is worth expanding on.

The problem is a combination of factors: Json.NET is strong named, has frequent releases, the assembly version number changes with each release and many different libraries reference Json.NET.

NuGet does its best to solve the issue of different assemblies referencing different versions by automatically inserting binding redirects for you, but having to rely on a tool to fix up problems is sub-optimal.

The solution that I’m evaluating to improve the situation is to only update the assembly version number on major releases (update: now evaluating never updating the assembly version). For example Json.NET 4.5 R1 has an assembly version number of 4.5.0.0, R2 will have an the version number 4.5.0.0, R3 = 4.5.0.0, and so on. While the assembly version number will be static the assembly file version number will continue to be updated each release so you can identify exactly which version you are using, e.g. 4.5.1.14720.

The .NET framework is doing something similar with .NET 4.5, replacing 4.0 assemblies with new files using the same version number.

Json.NET Metro Upgrade Kit

Metro Color Conversion

The Metro UI color scheme looks complex and hard to code for at first but Json.NET has everything under control with its advanced automatic Metro Color Enhancement Suite™.

Before:

Color[] colors = new []{ Color.Blue, Color.Red, Color.Yellow, Color.Green, Color.Black, Color.Brown };
 
string json = JsonConvert.SerializeObject(colors);
// ["Blue", "Red", "Yellow", "Green", "Black", "Brown"]

Hey, what’s the matter? Oh, right. My grotesque appearence!

Yuck! Color is so 2011.

Json.NET Metro Enhanced:

Color[] colors = new []{ Color.Blue, Color.Red, Color.Yellow, Color.Green, Color.Black, Color.Brown };
 
string json = JsonConvert.SerializeObject(colors);
//["Gray", "Gray", "Gray", "Gray", "Black", "Gray"]

Call me a killjoy, but I think that because this is not to my taste, no one else should be able to enjoy it.

Now my Metro application will fit right in!

Metro Text Rendering

The application now looks right but there is someone off about the content. Don’t fear, Json.NET’s Metro Integration automatically upgrades your existing content to be Windows 8 ready.

Before:

string json = JsonConvert.SerializeObject(product);
//{
//  "Name": "Apple",
//  "ExpiryDate": "2012-04-01T00:00:00",
//  "Price": 3.99,
//  "Sizes": [ "Small", "Medium", "Large" ]
//}

Are these words? I can barely even read this!

Json.NET Metro Enhanced:

string json = JsonConvert.SerializeObject(product);
//{
//  ":::NAME:::": ":::APPLE:::",
//  ":::EXPIRYDATE:::": "2012-04-01T00:00:00",
//  ":::PRICE:::": 3.99,
//  ":::SIZES:::": [ ":::SMALL:::", ":::MEDIUM:::", ":::LARGE:::" ]
//}

Oh that’s much better.

In-place Upgrade Kit

Json.NET Metro Integration will be included in the next release but until then an upgrade kit has been put together. Begin building tomorrow’s next generation UIs today!

https://gist.github.com/2269465

string json = JsonConvert.SerializeObject(value, new JsonSerializerSettings
{
  ContractResolver = new MetroPropertyNameResolver(),
  Converters = { new MetroStringConverter(), new MetroColorConverter() },
  Formatting = Formatting.Indented
});

:::HAPPY CODING!!!!:::