Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
74 changes: 74 additions & 0 deletions uSync.Core/Json/JsonBlockItemConverters.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
using System.Text.Json;
using System.Text.Json.Serialization;

using Umbraco.Cms.Core.Models.Blocks;
using Umbraco.Extensions;

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() ?? "null");
writer.WriteString("contentUdi", "null");
writer.WriteString("settingsKey", value.SettingsKey.ToString() ?? "null");
Comment thread
KevinJump marked this conversation as resolved.
Outdated
Comment thread
KevinJump marked this conversation as resolved.
Outdated
writer.WriteString("settingsUdi", "null");
Comment thread
KevinJump marked this conversation as resolved.
Outdated
Comment thread
KevinJump marked this conversation as resolved.
Outdated
writer.WriteEndObject();
}
}

public class JsonBlockListLayoutItemConverter : JsonBlockItemConverterBase<BlockListLayoutItem> { }

public class JsonBlockGridLayoutItemConverter : JsonBlockItemConverterBase<BlockGridLayoutItem> { }
3 changes: 3 additions & 0 deletions uSync.Core/Json/XElementJsonConverter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
using System.Text.Json.Serialization;
using System.Xml.Linq;

using Umbraco.Cms.Core.Models.Blocks;

Comment thread
KevinJump marked this conversation as resolved.
Outdated
namespace uSync.Core.Json;

public class JsonXElementConverter : JsonConverter<XElement>
Expand All @@ -16,3 +18,4 @@ public override void Write(Utf8JsonWriter writer, XElement value, JsonSerializer
writer.WriteStringValue(value.ToString());
}
}

Loading