Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions uSync.Core/Extensions/JsonTextExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ public static class JsonTextExtensions
new JsonUdiRangeConverter(),
new JsonBooleanConverter(),
new JsonXElementConverter(),
new JsonBlockListLayoutItemConverter(),
new JsonBlockGridLayoutItemConverter()
}
};

Expand Down
78 changes: 78 additions & 0 deletions uSync.Core/Json/JsonBlockItemConverters.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
using System.Text.Json;
using System.Text.Json.Serialization;

using Umbraco.Cms.Core.Models.Blocks;

namespace uSync.Core.Json;

/// <summary>
/// in v16 the BlockLayoutItem(s) have obsolete properties that are sometimes set and sometimes not
/// this leads to false positive's when looking for changes.
///
/// these two custom converters write those properties out as null, so they never change. causing
/// the serialized json to be consistent.
/// </summary>

public abstract class JsonBlockItemConverterBase<T> : JsonConverter<T>
where T : BlockLayoutItemBase, new()
{
public override T? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType != JsonTokenType.StartObject)
throw new JsonException("Invalid JSON expecting start object");

var item = new T();

while (reader.Read())
{
if (reader.TokenType == JsonTokenType.EndObject)
return item;

if (reader.TokenType != JsonTokenType.PropertyName)
throw new JsonException("Expecting property name");

var propertyName = reader.GetString();
reader.Read();

switch (propertyName)
{
case "contentKey":
var contentKey = reader.GetString();
if (contentKey != null && Guid.TryParse(contentKey, out var contentGuid))
item.ContentKey = contentGuid;
break;
case "settingsKey":
var settingsKey = reader.GetString();
if (settingsKey != null && Guid.TryParse(settingsKey, out var settingsGuid))
item.SettingsKey = settingsGuid;
break;
default:
// we don't care about the obsolete properties here...
break;
}
}

throw new JsonException("Unexpected end of JSON");
}

public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
{
// we could just not write out the obsolete properties, but they will appear as null it
// lots of people's existing exports , so we can write them out as null to keep things consistent.
Comment on lines +60 to +61

Copilot AI Sep 15, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The comment has a grammatical error. 'but they will appear as null it lots of people's existing exports' should be 'but they will appear as null in lots of people's existing exports'.

Suggested change
// we could just not write out the obsolete properties, but they will appear as null it
// lots of people's existing exports , so we can write them out as null to keep things consistent.
// we could just not write out the obsolete properties, but they will appear as null in
// lots of people's existing exports, so we can write them out as null to keep things consistent.

Copilot uses AI. Check for mistakes.
writer.WriteStartObject();
writer.WriteString("contentKey", value.ContentKey.ToString());
writer.WriteNull("contentUdi");

if (value.SettingsKey.HasValue && value.SettingsKey != Guid.Empty)
writer.WriteString("settingsKey", value.SettingsKey.ToString());
else
writer.WriteNull("settingsKey");

writer.WriteNull("settingsUdi");
writer.WriteEndObject();
}
}

public class JsonBlockListLayoutItemConverter : JsonBlockItemConverterBase<BlockListLayoutItem> { }

public class JsonBlockGridLayoutItemConverter : JsonBlockItemConverterBase<BlockGridLayoutItem> { }
1 change: 1 addition & 0 deletions uSync.Core/Json/XElementJsonConverter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,4 @@ public override void Write(Utf8JsonWriter writer, XElement value, JsonSerializer
writer.WriteStringValue(value.ToString());
}
}

Loading