/// <summary> /// 将 JSON 字符串反序列化为指定类型的值。 /// </summary> /// <typeparam name="T">指定类型</typeparam> /// <param name="chars">JSON 字符串</param> /// <param name="length">JSON 字符串长度</param> /// <returns>返回指定类型的值</returns> public T Deserialize <T>(char *chars, int length) { var options = Options; if ((options & JsonFormatterOptions.MultiReferencingReference) != 0) { var jsonDeserializer = new JsonReferenceDeserializer(chars, length); if (id != 0) { jsonDeserializer.jsonFormatter = this; } var result = ValueInterface <T> .ReadValue(jsonDeserializer); if (jsonDeserializer.references.Count != 0) { ReferenceInfo.ProcessReference(result, jsonDeserializer.references); if (jsonDeserializer.updateBase) { result = RWHelper.GetContent <T>(jsonDeserializer.writer); } } return(result); } else { var jsonDeserializer = new JsonDeserializer(chars, length); if (id != 0) { jsonDeserializer.jsonFormatter = this; } return(ValueInterface <T> .ReadValue(jsonDeserializer)); } }
public static T DeserializeObject <T>(char *chars, int length, JsonFormatterOptions options) { if ((options & JsonFormatterOptions.MultiReferencingReference) != 0) { var jsonDeserializer = new JsonReferenceDeserializer(chars, length); var result = ValueInterface <T> .ReadValue(jsonDeserializer); if (jsonDeserializer.references.Count != 0) { ReferenceInfo.ProcessReference(result, jsonDeserializer.references); if (jsonDeserializer.updateBase) { result = RWHelper.GetContent <T>(jsonDeserializer.writer); } } return(result); } return(DeserializeObject <T>(chars, length)); }
private void InternalDeserializeTo <TMode>(char *chars, int length, IDataWriter dataWriter) where TMode : struct { var jsonDeserializer = new JsonDeserializer <TMode>(chars, length); if (jsonDeserializer.IsObject) { if (dataWriter is IId64DataRW <char> fastWriter) { jsonDeserializer.FastReadObject(fastWriter); } else { jsonDeserializer.SlowReadObject(dataWriter.As <string>()); } } else if (jsonDeserializer.IsArray) { jsonDeserializer.NoInliningReadArray(dataWriter.As <int>()); } else { RWHelper.SetContent(dataWriter, jsonDeserializer.DirectRead()); } }
public unsafe static StringBuilder Format <T>(string text, T args) { if (text == null) { return(null); } var reader = RWHelper.CreateReader(args).As <string>(); var builder = new StringBuilder(); fixed(char *pChars = text) { var length = text.Length; var startIndex = 0; for (int i = 0; i < length; i++) { if (pChars[i] == '\\' && i + 1 < length) { builder.Append(text, startIndex, i - startIndex); builder.Append(pChars[i + 1]); ++i; startIndex = i + 1; continue; } if (pChars[i] == '{') { if (length - i >= 3) { builder.Append(text, startIndex, i - startIndex); startIndex = i; for (++i; i < length; i++) { if (pChars[i] == '}') { var name = new string(pChars, startIndex + 1, i - startIndex - 1); var value = reader[name].DirectRead(); if (value is StringBuilder sb) { var sbLength = sb.Length; for (int s = 0; s < sbLength; s++) { builder.Append(sb[s]); } } else if (value != null) { builder.Append(value.ToString()); } startIndex = i + 1; break; } } } } } builder.Append(text, startIndex, length - startIndex); } return(builder); }
public static void DeserializeTo <T>(this IBinaryFormatter binaryFormatter, HGlobalCache <byte> hGCache, T obj) { binaryFormatter.DeserializeTo(hGCache, RWHelper.CreateWriter(obj)); }
public static void DeserializeTo <T>(this IBinaryFormatter binaryFormatter, Stream stream, T obj) { binaryFormatter.DeserializeTo(stream, RWHelper.CreateWriter(obj)); }
public static void DeserializeTo <T>(this IBinaryFormatter binaryFormatter, byte[] bytes, T obj) { binaryFormatter.DeserializeTo(bytes, RWHelper.CreateWriter(obj)); }
public static void DeserializeTo <T>(this ITextFormatter textFormatter, HGlobalCache <char> hGCache, T obj) { textFormatter.DeserializeTo(hGCache, RWHelper.CreateWriter(obj)); }
public static void DeserializeTo <T>(this ITextFormatter textFormatter, TextReader textReader, T obj) { textFormatter.DeserializeTo(textReader, RWHelper.CreateWriter(obj)); }
public static void DeserializeTo <T>(this IBinaryFormatter binaryFromatter, ReadOnlySpan <byte> text, T obj) { binaryFromatter.DeserializeTo(text, RWHelper.CreateWriter(obj)); }
public static void DeserializeTo <T>(this ITextFormatter textFormatter, ReadOnlySpan <char> text, T obj) { textFormatter.DeserializeTo(text, RWHelper.CreateWriter(obj)); }
public static async Task DeserializeToAsync <T>(this ITextFormatter textFormatter, Stream stream, T obj) { await textFormatter.DeserializeToAsync(stream, RWHelper.CreateWriter(obj)); }
public void ReferencingTest() { var obj = new { Id = 123, Name = "Dogwei", Obj = (object)null }; var arr = new object[2]; arr[0] = new { Id = 123 }; arr[1] = arr[0]; RWHelper.CreateRW(obj).As <string>()["Obj"].DirectWrite(obj); AreEqual( JsonFormatter.SerializeObject(obj, JsonFormatterOptions.LoopReferencingNull), "{\"Id\":123,\"Name\":\"Dogwei\",\"Obj\":null}" ); AreEqual( JsonFormatter.SerializeObject(obj, JsonFormatterOptions.MultiReferencingNull), "{\"Id\":123,\"Name\":\"Dogwei\",\"Obj\":null}" ); AreEqual( JsonFormatter.SerializeObject(obj, JsonFormatterOptions.MultiReferencingReference), "{\"Id\":123,\"Name\":\"Dogwei\",\"Obj\":{\"$ref\":\"#\"}}" ); Catch <JsonOutOfDepthException>(() => JsonFormatter.SerializeObject(obj)); Catch <JsonLoopReferencingException>(() => JsonFormatter.SerializeObject(obj, JsonFormatterOptions.LoopReferencingException)); AreEqual( JsonFormatter.SerializeObject(arr, JsonFormatterOptions.LoopReferencingNull), "[{\"Id\":123},{\"Id\":123}]" ); AreEqual( JsonFormatter.SerializeObject(arr, JsonFormatterOptions.MultiReferencingNull), "[{\"Id\":123},null]" ); AreEqual( JsonFormatter.SerializeObject(arr, JsonFormatterOptions.MultiReferencingReference), "[{\"Id\":123},{\"$ref\":\"#/0\"}]" ); JsonFormatter.SerializeObject(arr); JsonFormatter.SerializeObject(arr, JsonFormatterOptions.LoopReferencingException); AreEqual( JsonFormatter.SerializeObject(ValueInterface <DataTable> .ReadValue(ValueCopyer.ValueOf(arr)), JsonFormatterOptions.MultiReferencingNull), "[{\"Id\":123},{\"Id\":123}]" ); AreEqual( JsonFormatter.SerializeObject(ValueInterface <DataTable> .ReadValue(ValueCopyer.ValueOf(arr)).CreateDataReader(), JsonFormatterOptions.MultiReferencingNull), "[{\"Id\":123},{\"Id\":123}]" ); AreEqual( JsonFormatter.SerializeObject(Enumerable.Range(0, 10), JsonFormatterOptions.MultiReferencingNull), "[0,1,2,3,4,5,6,7,8,9]" ); var mar = new object[, ] { { arr[0], arr[0] }, { arr[0], arr[0] } }; AreEqual( JsonFormatter.SerializeObject(mar, JsonFormatterOptions.LoopReferencingNull), "[[{\"Id\":123},{\"Id\":123}],[{\"Id\":123},{\"Id\":123}]]" ); AreEqual( JsonFormatter.SerializeObject(mar, JsonFormatterOptions.MultiReferencingNull), "[[{\"Id\":123},null],[null,null]]" ); AreEqual( JsonFormatter.SerializeObject(mar, JsonFormatterOptions.MultiReferencingReference), "[[{\"Id\":123},{\"$ref\":\"#/0/0\"}],[{\"$ref\":\"#/0/0\"},{\"$ref\":\"#/0/0\"}]]" ); JsonFormatter.SerializeObject(mar); JsonFormatter.SerializeObject(mar, JsonFormatterOptions.LoopReferencingException); var dic2 = JsonFormatter.DeserializeObject <object[]>("[{\"Id\":123},{\"$ref\":\"#/0\"}]"); AreEqual(JsonFormatter.SerializeObject(dic2[1]), "{\"$ref\":\"#/0\"}"); var mar2 = JsonFormatter.DeserializeObject <object[, ]>("[[{\"Id\":123},{\"$ref\":\"#/0/0\"}],[{\"$ref\":\"#/0/0\"},{\"$ref\":\"#/0/0\"}]]", JsonFormatterOptions.MultiReferencingReference); AreEqual(mar2[0, 0], mar2[0, 1]); AreEqual(mar2[1, 0], mar2[0, 1]); AreEqual(mar2[1, 0], mar2[1, 1]); }