Skip to content

Commit

Permalink
Fix #166 - Guid conversion to JSON is unquoted
Browse files Browse the repository at this point in the history
  • Loading branch information
aaubry committed Feb 29, 2016
1 parent f3cbdc9 commit f3bcdf1
Show file tree
Hide file tree
Showing 6 changed files with 35 additions and 14 deletions.
2 changes: 1 addition & 1 deletion YamlDotNet.Test/Serialization/CodeValidations.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public void AllBuiltInConvertersAreRegistered()
.Where(t => !t.IsInterface && interfaceType.IsAssignableFrom(t));

var unregisteredTypes = converterTypes
.Where(t => !YamlTypeConverters.BuiltInConverters.Any(c => c.GetType() == t))
.Where(t => !YamlTypeConverters.GetBuiltInConverters(false).Any(c => c.GetType() == t))
.ToArray();

Assert.Equal(new Type[0], unregisteredTypes);
Expand Down
16 changes: 15 additions & 1 deletion YamlDotNet.Test/Serialization/SerializationTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -575,7 +575,7 @@ public void SerializeGuid()
Serializer.Serialize(writer, guid);
var serialized = writer.ToString();
Dump.WriteLine(writer.ToString());
Regex.IsMatch(serialized, "^" + guid.ToString("D")).Should().BeTrue("serialized content should contain the guid");
Regex.IsMatch(serialized, "^" + guid.ToString("D")).Should().BeTrue("serialized content should contain the guid, but instead contained: " + serialized);
}

[Fact]
Expand Down Expand Up @@ -1071,5 +1071,19 @@ public void GenericListThatDoesNotImplementIListCanBeDeserialized()
Assert.Contains("a", deserialized);
Assert.Contains("b", deserialized);
}

[Fact]
public void GuidsShouldBeQuotedWhenSerializedAsJson()
{
var sut = new Serializer(SerializationOptions.JsonCompatible | SerializationOptions.EmitDefaults);

var yamlAsJson = new StringWriter();
sut.Serialize(yamlAsJson, new
{
id = Guid.Empty
});

Assert.Contains("\"00000000-0000-0000-0000-000000000000\"", yamlAsJson.ToString());
}
}
}
19 changes: 14 additions & 5 deletions YamlDotNet/Serialization/Converters/GuidConverter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,24 @@
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.

// SOFTWARE.

using YamlDotNet.Core;

namespace YamlDotNet.Serialization.Converters
{
/// <summary>
/// Converter for System.Guid.
/// </summary>
public class GuidConverter : IYamlTypeConverter
{
{
private readonly bool jsonCompatible;

public GuidConverter(bool jsonCompatible)
{
this.jsonCompatible = jsonCompatible;
}

public bool Accepts(System.Type type)
{
return type == typeof (System.Guid);
Expand All @@ -40,8 +49,8 @@ public object ReadYaml(Core.IParser parser, System.Type type)

public void WriteYaml(Core.IEmitter emitter, object value, System.Type type)
{
var guid = (System.Guid) value;
emitter.Emit(new Core.Events.Scalar(guid.ToString("D")));
var guid = (System.Guid) value;
emitter.Emit(new Core.Events.Scalar(null, null, guid.ToString("D"), jsonCompatible ? ScalarStyle.DoubleQuoted : ScalarStyle.Any, true, false));
}
}
}
2 changes: 1 addition & 1 deletion YamlDotNet/Serialization/Deserializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ public IPropertyDescriptor GetProperty(Type type, object container, string name,
);

converters = new List<IYamlTypeConverter>();
foreach (IYamlTypeConverter yamlTypeConverter in YamlTypeConverters.BuiltInConverters)
foreach (IYamlTypeConverter yamlTypeConverter in YamlTypeConverters.GetBuiltInConverters(false))
{
converters.Add(yamlTypeConverter);
}
Expand Down
2 changes: 1 addition & 1 deletion YamlDotNet/Serialization/Serializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public Serializer(SerializationOptions options = SerializationOptions.None, INam
this.namingConvention = namingConvention ?? new NullNamingConvention();

Converters = new List<IYamlTypeConverter>();
foreach (IYamlTypeConverter yamlTypeConverter in Utilities.YamlTypeConverters.BuiltInConverters)
foreach (IYamlTypeConverter yamlTypeConverter in Utilities.YamlTypeConverters.GetBuiltInConverters(IsOptionSet(SerializationOptions.JsonCompatible)))
{
Converters.Add(yamlTypeConverter);
}
Expand Down
8 changes: 3 additions & 5 deletions YamlDotNet/Serialization/Utilities/YamlTypeConverters.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,9 @@ namespace YamlDotNet.Serialization.Utilities
{
internal static class YamlTypeConverters
{
private static readonly IEnumerable<IYamlTypeConverter> _builtInTypeConverters = new IYamlTypeConverter[]
public static IEnumerable<IYamlTypeConverter> GetBuiltInConverters(bool jsonCompatible)
{
new GuidConverter(),
};

public static IEnumerable<IYamlTypeConverter> BuiltInConverters { get { return _builtInTypeConverters; } }
yield return new GuidConverter(jsonCompatible);
}
}
}

0 comments on commit f3bcdf1

Please sign in to comment.