Skip to content

Commit 8d4cf41

Browse files
russcamMpdreamz
authored andcommitted
Correctly deserialize JoinField (#3357)
* Correctly deserialize JoinField When the join field is a string and using JsonNetSerializer, the string conversion should not emit the surrounding double quotes Closes #3356 * Use SerializationTester Update following PR
1 parent 9af260c commit 8d4cf41

File tree

4 files changed

+43
-1
lines changed

4 files changed

+43
-1
lines changed

src/Serializers/Nest.JsonNetSerializer/Converters/HandleNestTypesOnSourceJsonConverter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist
4545
//even though we pass type JSON.NET won't try the registered converter for that type
4646
//even if it can handle string tokens :(
4747
if (objectType == typeof(JoinField) && token.Type == JTokenType.String)
48-
return JoinField.Root(token.ToString(Formatting.None));
48+
return JoinField.Root(token.Value<string>());
4949

5050
using (var ms = token.ToStream())
5151
return _builtInSerializer.Deserialize(objectType, ms);

src/Tests/Tests.Core/Client/TestClient.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using Nest;
2+
using Nest.JsonNetSerializer;
23
using Tests.Configuration;
34
using Tests.Core.Client.Settings;
45
using Tests.Domain.Extensions;
@@ -9,6 +10,8 @@ public static class TestClient
910
{
1011
public static readonly IElasticClient Default = new ElasticClient(new TestConnectionSettings().ApplyDomainSettings());
1112
public static readonly IElasticClient DefaultInMemoryClient = new ElasticClient(new AlwaysInMemoryConnectionSettings().ApplyDomainSettings());
13+
public static readonly IElasticClient InMemoryWithJsonNetSerializer = new ElasticClient(
14+
new AlwaysInMemoryConnectionSettings(sourceSerializerFactory: JsonNetSerializer.Default).ApplyDomainSettings());
1215
public static readonly IElasticClient DisabledStreaming = new ElasticClient(new TestConnectionSettings().ApplyDomainSettings().DisableDirectStreaming());
1316

1417
public static readonly ITestConfiguration Configuration = TestConfiguration.Instance;

src/Tests/Tests.Core/Serialization/SerializationTester.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Linq;
4+
using System.Net;
45
using System.Text;
56
using Elasticsearch.Net;
67
using FluentAssertions;
@@ -64,6 +65,8 @@ public class SerializationTester
6465
{
6566
public static SerializationTester Default { get; } = new SerializationTester(TestClient.DefaultInMemoryClient);
6667

68+
public static SerializationTester DefaultWithJsonNetSerializer { get; } = new SerializationTester(TestClient.InMemoryWithJsonNetSerializer);
69+
6770
public SerializationTester(IElasticClient client) => this.Client = client;
6871

6972
public IElasticClient Client { get; }
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using System;
2+
using Elastic.Xunit.XunitPlumbing;
3+
using FluentAssertions;
4+
using Nest;
5+
using Tests.Core.Extensions;
6+
using Tests.Core.Serialization;
7+
8+
namespace Tests.Reproduce
9+
{
10+
public class GithubIssue3356
11+
{
12+
[U]
13+
public void JoinFieldDeserializedCorrectly()
14+
{
15+
var doc = new MyDocument
16+
{
17+
Join = JoinField.Root("parent")
18+
};
19+
20+
var tester = SerializationTester.DefaultWithJsonNetSerializer;
21+
var response = tester.Client.IndexDocument(doc);
22+
23+
tester.AssertSerialize(response.ApiCall.RequestBodyInBytes, new { join = "parent" });
24+
doc = tester.AssertDeserialize<MyDocument>(response.ApiCall.RequestBodyInBytes);
25+
26+
doc.Join.Match(
27+
p => { p.Name.Should().Be("parent"); },
28+
c => throw new InvalidOperationException("should not be called"));
29+
}
30+
31+
private class MyDocument
32+
{
33+
public JoinField Join { get; set; }
34+
}
35+
}
36+
}

0 commit comments

Comments
 (0)