Source/Tx.Bond/BondJsonEnvelopeTypeMap.cs (59 lines of code) (raw):

// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. namespace Tx.Bond { using System; using System.Collections.Generic; using System.Reactive; using System.Text; using System.Web.Script.Serialization; using global::Bond; using global::Bond.IO.Safe; using global::Bond.Protocols; public class BondJsonEnvelopeTypeMap : EnvelopeTypeMap { protected readonly JavaScriptSerializer JsonSerializer; public BondJsonEnvelopeTypeMap() : this(false, JsonTransformBuilder.DefaultSerializer) { } public BondJsonEnvelopeTypeMap(bool handleTransportObject, JavaScriptSerializer serializer) : base(handleTransportObject) { if (serializer == null) { throw new ArgumentNullException(nameof(serializer)); } this.JsonSerializer = serializer; } protected override IReadOnlyDictionary<string, Func<byte[], object>> BuildDeserializers(Type outputType) { Func<byte[], object> jsonDeserializer = e => this.DeserializeJson(e, outputType); var deserializerMap = new Dictionary<string, Func<byte[], object>>(StringComparer.Ordinal) { { Protocol.Json, jsonDeserializer }, }; if (outputType.IsBondStruct()) { var deserializer = new Deserializer<CompactBinaryReader<InputBuffer>>(outputType); deserializerMap.Add(Protocol.CompactBinaryV1, e => DeserializeCompactBinary(1, e, deserializer)); deserializerMap.Add(Protocol.CompactBinaryV2, e => DeserializeCompactBinary(2, e, deserializer)); } return deserializerMap; } private static object DeserializeCompactBinary( ushort version, byte[] data, Deserializer<CompactBinaryReader<InputBuffer>> deserializer) { var inputStream = new InputBuffer(data); var reader = new CompactBinaryReader<InputBuffer>(inputStream, version); var outputObject = deserializer.Deserialize(reader); return outputObject; } private object DeserializeJson(byte[] data, Type outputType) { var json = Encoding.UTF8.GetString(data); return this.JsonSerializer.Deserialize(json, outputType); } } }