嘗試在Silverlight中反序列化時出現異常。 Test1失敗,而Test2成功。我也嘗試了TypeNameAssemblyFormat對簡單和完整,但得到相同的結果。 Test2可以解析程序集,爲什麼不能Json.NET?如何使用Json.NET Silverlight中的TypeNameHandling.Objects進行反序列化?
更新:忘了提及我試圖反序列化的類型是在與發生反序列化的silverlight程序集不同的程序集中定義的。
這兩個測試都在非Silverlight .NET應用程序中工作。
如何反序列化具有typenames的json字符串?
private void Test1()
{
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.TypeNameHandling = TypeNameHandling.Objects;
string json1 = "{\"$type\":\"AmberGIS.NetworkTrace.DTO.NTPoint, NetworkTrace.DTO.Assembly\",\"X\":0.0,\"Y\":0.0,\"SpatialReference\":null}";
try
{
var n1 = JsonConvert.DeserializeObject<NTPoint>(json1, settings);
//Error resolving type specified in JSON 'AmberGIS.NetworkTrace.DTO.NTPoint, NetworkTrace.DTO.Assembly'.
//Could not load file or assembly 'NetworkTrace.DTO.Assembly, Culture=neutral, PublicKeyToken=null' or one of its dependencies.
//The requested assembly version conflicts with what is already bound in the app domain or specified in the manifest.
//(Exception from HRESULT: 0x80131053)
}
catch (Exception ex)
{
while (ex != null)
{
Debug.WriteLine(ex.Message);
ex = ex.InnerException;
}
}
}
這Test2的成功:
private void Test2()
{
var pnt1 = new AmberGIS.NetworkTrace.DTO.NTPoint();
Debug.WriteLine(pnt1.GetType().AssemblyQualifiedName);
// "AmberGIS.NetworkTrace.DTO.NTPoint, NetworkTrace.DTO.Assembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
string fullName = "AmberGIS.NetworkTrace.DTO.NTPoint, NetworkTrace.DTO.Assembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";
var t = Type.GetType(fullName);
var pnt2 = Activator.CreateInstance(t) as NTPoint;
}
你爲什麼不加入您的解決方案爲答案,接受它:通過遍歷所有(嵌套)對象和插入組件信息修改JSON所以它會沒有出現在沒有答案的列表中? – keyr 2012-12-03 07:36:41
@keyr完成了,但希望得到一個更簡單的解決方案。 – 2012-12-03 15:37:00