internal class Program
private static void Main(string[] args)
Dictionary<string, Account> accounts;
var jsonSerializerSettings = new JsonSerializerSettings
TypeNameHandling = TypeNameHandling.Objects,
TypeNameAssemblyFormat = FormatterAssemblyStyle.Simple
using (var streamReader = new StreamReader("accounts.json"))
var json = streamReader.ReadToEnd();
accounts = JsonConvert.DeserializeObject<Dictionary<string, Account>>(json, jsonSerializerSettings);
foreach (var account in accounts)
Debug.WriteLine(account.Value.Name);
internal class Account
public string Id { get; set; }
public string Name { get; set; }
public byte[] EncryptedPassword { get; set; }
}
internal class HasByteArray
public byte[] EncryptedPassword { get; set; }
}
现在,如果我试着用
TypeNameHandling.Objects
往返全班
代码语言:
javascript
复制
private static void TestSimple()
var test = new HasByteArray { EncryptedPassword = Convert.FromBase64String("cGFzc3dvcmQ=") };
TestRoundTrip(test);
catch (Exception ex)
Debug.WriteLine(ex);
private static void TestRoundTrip<T>(T item)
var jsonSerializerSettings = new JsonSerializerSettings
TypeNameHandling = TypeNameHandling.Objects,
TypeNameAssemblyFormat = FormatterAssemblyStyle.Simple
TestRoundTrip<T>(item, jsonSerializerSettings);
private static void TestRoundTrip<T>(T item, JsonSerializerSettings jsonSerializerSettings)
var json = JsonConvert.SerializeObject(item, Formatting.Indented, jsonSerializerSettings);
Debug.WriteLine(json);
var item2 = JsonConvert.DeserializeObject<T>(json, jsonSerializerSettings);
var json2 = JsonConvert.SerializeObject(item2, Formatting.Indented, jsonSerializerSettings);
Debug.WriteLine(json2);
if (!JToken.DeepEquals(JToken.Parse(json), JToken.Parse(json2)))
throw new InvalidOperationException("Round Trip Failed");
}
我得到以下例外:
代码语言:
javascript
复制
Newtonsoft.Json.JsonSerializationException: Additional text found in JSON string after finishing deserializing object.
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent) in C:\Development\Releases\Json\Working\Newtonsoft.Json\Working-Signed\Src\Newtonsoft.Json\Serialization\JsonSerializerInternalReader.cs:line 196
at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType) in C:\Development\Releases\Json\Working\Newtonsoft.Json\Working-Signed\Src\Newtonsoft.Json\JsonSerializer.cs:line 823
at Newtonsoft.Json.JsonSerializer.Deserialize(JsonReader reader, Type objectType) in C:\Development\Releases\Json\Working\Newtonsoft.Json\Working-Signed\Src\Newtonsoft.Json\JsonSerializer.cs:line 802
at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings) in C:\Development\Releases\Json\Working\Newtonsoft.Json\Working-Signed\Src\Newtonsoft.Json\JsonConvert.cs:line 863
at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings) in C:\Development\Releases\Json\Working\Newtonsoft.Json\Working-Signed\Src\Newtonsoft.Json\JsonConvert.cs:line 820
at Question34654184.TestClass.TestRoundTrip[T](T item, JsonSerializerSettings jsonSerializerSettings)
at Question34654184.TestClass.TestRoundTrip[T](T item)
at Question34654184.TestClass.TestSimple()
public class ByteArrayConverter : JsonConverter
public override bool CanConvert(Type objectType)
return objectType == typeof(byte[]);
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
if (reader.TokenType == JsonToken.Null)
return null;
var token = JToken.Load(reader);
if (token == null)
return null;
switch (token.Type)
case JTokenType.Null:
return null;
case JTokenType.String:
return Convert.FromBase64String((string)token);
case JTokenType.Object:
var value = (string)token["$value"];
return value == null ? null : Convert.FromBase64String(value);
default:
throw new JsonSerializationException("Unknown byte array format");
public override bool CanWrite { get { return false; } } // Use the default implementation for serialization, which is not broken.
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
throw new NotImplementedException();