Skip to content

Commit 43a86a5

Browse files
shravan2xRehanSaeed
authored andcommitted
Updated ContextJsonConverter to support array contexts
1 parent 2fb57ff commit 43a86a5

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

Source/Common/ContextJsonConverter.cs

+24-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public override JsonLdContext ReadJson(JsonReader reader, Type objectType, JsonL
4242
name = (string?)reader.Value;
4343
language = null;
4444
}
45-
else
45+
else if (reader.TokenType == JsonToken.StartObject)
4646
{
4747
var o = JObject.Load(reader);
4848

@@ -52,6 +52,29 @@ public override JsonLdContext ReadJson(JsonReader reader, Type objectType, JsonL
5252
var languageProperty = o.Property("@language", StringComparison.OrdinalIgnoreCase);
5353
language = languageProperty?.Value?.ToString();
5454
}
55+
else
56+
{
57+
var a = JArray.Load(reader);
58+
59+
name = language = null;
60+
foreach (var entry in a)
61+
{
62+
if (entry.Type == JTokenType.String)
63+
{
64+
name ??= (string?)entry;
65+
}
66+
else
67+
{
68+
var o = (JObject)entry;
69+
70+
var nameProperty = o.Property("name", StringComparison.OrdinalIgnoreCase);
71+
name ??= nameProperty?.Value?.ToString() ?? "https://schema.org";
72+
73+
var languageProperty = o.Property("@language", StringComparison.OrdinalIgnoreCase);
74+
language ??= languageProperty?.Value?.ToString();
75+
}
76+
}
77+
}
5578

5679
#pragma warning disable CA1062 // Validate arguments of public methods
5780
context.Name = name;

Tests/Schema.NET.Test/ContextJsonConverterTest.cs

+12
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,18 @@ public void ReadJson_ObjectContextWithNameAndLanguage_ContextHasNameAndLanguage(
4040
Assert.Equal("en", thing?.Context.Language);
4141
}
4242

43+
[Fact]
44+
public void ReadJson_ArrayContextWithNameAndLanguage_ContextHasNameAndLanguage()
45+
{
46+
var json = "{\"@context\":[\"foo\",{\"@language\":\"en\"}],\"@type\":\"Thing\"}";
47+
48+
var thing = SchemaSerializer.DeserializeObject<Thing>(json);
49+
50+
Assert.NotNull(thing?.Context);
51+
Assert.Equal("foo", thing?.Context.Name);
52+
Assert.Equal("en", thing?.Context.Language);
53+
}
54+
4355
[Fact]
4456
public void WriteJson_StringContext_ContextHasName()
4557
{

0 commit comments

Comments
 (0)