Skip to content
Draft
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
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
### Version: 1.3.1
#### Date: June-23-2026
- Added `EmbeddedObject` as a concrete implementation of `IEmbeddedObject`, covering both `IEmbeddedEntry` and `IEmbeddedAsset`.
- Added `EmbeddedObjectConverter` to resolve `IEmbeddedObject` during JSON deserialization without requiring changes in consumer code.
- Custom fields on embedded entries and assets are preserved via `[JsonExtensionData]`.

### Version: 1.3.0

#### Date: May-11-2026
Expand Down
34 changes: 34 additions & 0 deletions Contentstack.Utils/Converters/EmbeddedObjectConverter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
using System;
using Contentstack.Utils.Interfaces;
using Contentstack.Utils.Models;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace Contentstack.Utils.Converters
{
// Resolves IEmbeddedObject to EmbeddedObject during deserialization.
// CanConvert uses exact type match so customer-defined subclasses are not intercepted.
public class EmbeddedObjectConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
=> objectType == typeof(IEmbeddedObject);

public override bool CanWrite => false;

public override object ReadJson(JsonReader reader, Type objectType,
object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null)
return null;

var jo = JObject.Load(reader);
var result = new EmbeddedObject();
serializer.Populate(jo.CreateReader(), result);
return result;
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
=> throw new NotSupportedException(
"EmbeddedObjectConverter is read-only. Serialize EmbeddedObject directly.");
}
}
30 changes: 30 additions & 0 deletions Contentstack.Utils/Models/EmbeddedObject.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
using System.Collections.Generic;
using Contentstack.Utils.Interfaces;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace Contentstack.Utils.Models
{
// Concrete class used by EmbeddedObjectConverter when deserializing _embedded_items.
// Implements both IEmbeddedEntry and IEmbeddedAsset to cover entries and assets.
public class EmbeddedObject : IEmbeddedEntry, IEmbeddedAsset
{
[JsonProperty("uid")]
public string Uid { get; set; } = string.Empty;

[JsonProperty("_content_type_uid")]
public string ContentTypeUid { get; set; } = string.Empty;

[JsonProperty("title")]
public string Title { get; set; } = string.Empty;

[JsonProperty("filename")]
public string FileName { get; set; } = string.Empty;

[JsonProperty("url")]
public string Url { get; set; } = string.Empty;

// Any field not explicitly declared above (custom fields, locale data, etc.)
[JsonExtensionData]
public IDictionary<string, JToken> Fields { get; set; } = new Dictionary<string, JToken>();
}
}
2 changes: 1 addition & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<Project>
<PropertyGroup>
<Version>1.3.0</Version>
<Version>1.3.1</Version>
</PropertyGroup>
</Project>
Loading