/// <summary> /// From Json String to MessagePack binary /// </summary> public static byte[] FromJson(TextReader reader) { using (var jr = new TinyJsonReader(reader, false)) { var stream = new MsgPackStream(1024); FromJsonCore(jr, stream); return(stream.Output.ToArray()); } }
private static uint FromJsonCore(TinyJsonReader jr, MsgPackStream stream) { uint count = 0; while (jr.Read()) { switch (jr.TokenType) { case TinyJsonToken.None: break; case TinyJsonToken.EndObject: return(count); case TinyJsonToken.EndArray: return(count); case TinyJsonToken.StartObject: { var innerStream = new MsgPackStream(1024); var mapCount = FromJsonCore(jr, innerStream) / 2; StreamWriter.WriteMapHeader(mapCount, stream); stream.WriteBytes(innerStream.Output); count++; break; } case TinyJsonToken.StartArray: { var innerStream = new MsgPackStream(1024); var arrayCount = FromJsonCore(jr, innerStream); StreamWriter.WriteArrayHeader(arrayCount, stream); stream.WriteBytes(innerStream.Output); count++; break; } case TinyJsonToken.Number: var v = jr.ValueType; if (v == ValueType.Double) { StreamWriter.WriteDouble(jr.DoubleValue, stream); } else if (v == ValueType.Long) { StreamWriter.WriteInt64(jr.LongValue, stream); } else if (v == ValueType.ULong) { StreamWriter.WriteUInt64(jr.ULongValue, stream); } else if (v == ValueType.Decimal) { StreamWriter.WriteString(jr.DecimalValue.ToString(CultureInfo.InvariantCulture), stream); } count++; break; case TinyJsonToken.String: StreamWriter.WriteString(jr.StringValue, stream); count++; break; case TinyJsonToken.True: StreamWriter.WriteBool(true, stream); count++; break; case TinyJsonToken.False: StreamWriter.WriteBool(false, stream); count++; break; case TinyJsonToken.Null: StreamWriter.WriteNil(stream); count++; break; } } return(count); }