Skip to content

Commit d76993c

Browse files
committed
Fixed array deserialization to be limited at number of child tokens. Fixed item list unit test to reflect new semantics.
1 parent b86bfbf commit d76993c

File tree

2 files changed

+31
-16
lines changed

2 files changed

+31
-16
lines changed

Source/Schema.NET/ValuesJsonConverter.cs

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ public override object ReadJson(
4949
var value = reader.Value;
5050

5151
var token = JToken.Load(reader);
52+
var count = token.Children().Count();
5253
if (mainType.GenericTypeArguments.Length == 1)
5354
{
5455
var type = mainType.GenericTypeArguments[0];
@@ -66,18 +67,28 @@ public override object ReadJson(
6667
{
6768
if (tokenType == JsonToken.StartArray)
6869
{
70+
var total = 0;
6971
var items = new List<object>();
7072
for (var i = mainType.GenericTypeArguments.Length - 1; i >= 0; i--)
7173
{
7274
var type = mainType.GenericTypeArguments[i];
7375
var unwrappedType = type.GetUnderlyingTypeFromNullable();
74-
var args = ReadJsonArray(token, unwrappedType);
76+
// only read as many items as there are tokens left
77+
var args = ReadJsonArray(token, unwrappedType, count - total);
7578

7679
if (args != null && args.Count > 0)
7780
{
7881
var genericType = typeof(OneOrMany<>).MakeGenericType(type);
7982
var item = (IValues)Activator.CreateInstance(genericType, args);
8083
items.Add(item);
84+
85+
total += args.Count;
86+
87+
if (total >= count)
88+
{
89+
// if we have deserialized enough items as there are tokens, break
90+
break;
91+
}
8192
}
8293
}
8394

@@ -396,11 +407,18 @@ private static Type ToClass(Type type)
396407
return type;
397408
}
398409

399-
private static IList ReadJsonArray(JToken token, Type type)
410+
private static IList ReadJsonArray(JToken token, Type type, int? count = null)
400411
{
401412
var classType = ToClass(type);
402413
var listType = typeof(List<>).MakeGenericType(classType);
403414
var list = Activator.CreateInstance(listType);
415+
var i = 0;
416+
417+
if (count == null)
418+
{
419+
// if maximum item count not assigned, set to count of child tokens
420+
count = token.Children().Count();
421+
}
404422

405423
foreach (var childToken in token.Children())
406424
{
@@ -423,6 +441,13 @@ private static IList ReadJsonArray(JToken token, Type type)
423441
.Invoke(list, new object[] { child });
424442
}
425443
}
444+
445+
i++;
446+
447+
if (i == count)
448+
{
449+
break;
450+
}
426451
}
427452

428453
return (IList)list;

Tests/Schema.NET.Test/core/ItemListTest.cs

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ public class ItemListTest
5858
[Fact]
5959
public void Deserializing_ItemListJsonLd_ReturnsMatchingItemList()
6060
{
61-
Assert.Equal(this.itemlist.ToString(), JsonConvert.DeserializeObject<Book>(this.json, TestDefaults.DefaultJsonSerializerSettings).ToString());
62-
Assert.Equal(JsonConvert.SerializeObject(this.itemlist, TestDefaults.DefaultJsonSerializerSettings), JsonConvert.SerializeObject(JsonConvert.DeserializeObject<Book>(this.json, TestDefaults.DefaultJsonSerializerSettings), TestDefaults.DefaultJsonSerializerSettings));
61+
Assert.Equal(this.itemlist.ToString(), JsonConvert.DeserializeObject<ItemList>(this.json, TestDefaults.DefaultJsonSerializerSettings).ToString());
62+
Assert.Equal(JsonConvert.SerializeObject(this.itemlist, TestDefaults.DefaultJsonSerializerSettings), JsonConvert.SerializeObject(JsonConvert.DeserializeObject<ItemList>(this.json, TestDefaults.DefaultJsonSerializerSettings), TestDefaults.DefaultJsonSerializerSettings));
6363
}
6464

6565
// https://developers.google.com/search/docs/guides/mark-up-listings
@@ -192,29 +192,19 @@ public void Deserializing_ItemListJsonLd_ReturnsItemList()
192192

193193
Assert.Equal("ItemList", itemList.Type);
194194
Assert.True(itemList.ItemListElement.HasValue);
195-
Assert.Equal(4, itemList.ItemListElement.Value.Count);
195+
Assert.Equal(2, itemList.ItemListElement.Value.Count);
196196
var listItems = (List<IListItem>)itemList.ItemListElement.Value;
197197
var things = (List<IThing>)itemList.ItemListElement.Value;
198198
Assert.Equal(2, listItems.Count);
199-
Assert.Equal(2, things.Count);
199+
Assert.Empty(things);
200200
var listItem1 = listItems.First();
201201
var listItem2 = listItems.Last();
202-
var thing1 = things.First();
203-
var thing2 = things.Last();
204-
var thingListItem1 = Assert.IsType<ListItem>(thing1);
205-
var thingListItem2 = Assert.IsType<ListItem>(thing2);
206202
Assert.Equal(1, listItem1.Position);
207203
Assert.Equal(2, listItem2.Position);
208-
Assert.Equal(1, thingListItem1.Position);
209-
Assert.Equal(2, thingListItem2.Position);
210204
var recipe1 = Assert.IsType<Recipe>(listItem1.Item.Single());
211205
var recipe2 = Assert.IsType<Recipe>(listItem2.Item.Single());
212-
var recipe3 = Assert.IsType<Recipe>(thingListItem1.Item.Single());
213-
var recipe4 = Assert.IsType<Recipe>(thingListItem2.Item.Single());
214206
Assert.Equal("Recipe 1", recipe1.Name);
215207
Assert.Equal("Recipe 2", recipe2.Name);
216-
Assert.Equal("Recipe 1", recipe3.Name);
217-
Assert.Equal("Recipe 2", recipe4.Name);
218208
}
219209
}
220210
}

0 commit comments

Comments
 (0)