Why doesn't Json.Encode encode data returned from Json.Decode correctly?
当使用System.Web.Helpers中的Json类并运行以下代码时,我希望它会生成一个json字符串,其中包含与原始字符串相同的信息,但奇怪的是,它仅返回字符串
1 2 3 4 | string jsonData ="{ "employees": [ { "firstName":"John" , "lastName":"Doe" }, { "firstName":"Anna" , "lastName":"Smith" }, { "firstName":"Peter" , "lastName":"Jones" } ] }"; var json = Json.Decode(jsonData); string result = Json.Encode(json); // result is: {"employees" : {} } |
当我查看从Json.Decode返回的对象时,该数组将解码为DynamicJsonArray。如果我使用数组/列表/字典创建一个.NET对象,它似乎可以对它们进行完美编码,因此问题似乎与DynamicJsonArray有关。
如果我对没有数组的复杂json字符串进行编码/解码,则似乎工作正常:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | string jsonData ="{ "firstName": "John", "lastName": "Doe", "family": { "mother": { "firstName": "Anna", "lastName": "Smith" }, "father": { "firstName": "Peter", "lastName": "Jones" } } }"; var json = Json.Decode(jsonData); string result = Json.Encode(json); /* result is (formatted for readability): { "firstName" :"John", "lastName" :"Doe", "family" : { "mother" : { "firstName" :"Anna", "lastName":"Smith" }, "father" : { "firstName" :"Peter", "lastName" :"Jones" } } } */ |
我看过msdn上的文档,但找不到任何原因导致它不起作用。可能是错误还是设计使然?
更新
如果我在根节点处有一个数组数组的json字符串,它会正确地编码/解码,因此我真的开始怀疑这是一个错误(或者至少是非常不一致的):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | string jsonData ="[ { "firstName":"John" , "lastName":"Doe" }, { "firstName":"Anna" , "lastName":"Smith" }, { "firstName":"Peter" , "lastName":"Jones" } ]"; var json = Json.Decode(jsonData); string result = Json.Encode(json); /* result is (formatted for readability): [ { "firstName" :"John", "lastName" :"Doe" }, { "firstName" :"Anna", "lastName" :"Smith" }, { "firstName" :"Peter", "lastName" :"Jones" } ] */ |
更新2
我决定最终与Microsoft讨论一个问题。让我们看看他们怎么说:
http://connect.microsoft.com/VisualStudio/feedback/details/779119/data-from-json-decode-is-not-encoded-correctly-when-encoding-with-json-encode
我也遇到了这个错误,幸运的是该库现在是开源的,因此我们可以自己修复该错误:
https://aspnetwebstack.codeplex.com/SourceControl/latest
该修复程序位于System.Web.Helpers / DynamicJavaScriptConverter.cs中
1 2 3 4 5 6 7 8 9 10 11 12 | // Get the value for each member in the dynamic object foreach (string memberName in memberNames) { //replace this line //values[memberName] = DynamicHelper.GetMemberValue(obj, memberName); //with this code var value = DynamicHelper.GetMemberValue(obj, memberName); if (value is DynamicJsonArray) value = (object[])(DynamicJsonArray)value; values[memberName] = value; } |
我在Codeplex网站上提交了带有建议的修复程序的错误:
https://aspnetwebstack.codeplex.com/workitem/1085
您是否考虑过创建和使用类,然后可以对它们进行序列化/反序列化?
1 2 3 4 5 | JavaScriptSerializer serializer = new JavaScriptSerializer(); // to JSON string json = serializer.Serialize(EmployeeList); // from JSON EmployeeList employeeList = serializer.Deserialize<EmployeeList>(json); |
我几乎总是序列化/反序列化,因为我需要数据作为执行期间使用的对象。 但是我想这取决于您的情况。
我认为您应该使用Json.NET。 请参阅:Codeplex上的Json.NET