当使用System.Web.Helpers中的Json类并运行以下代码时,我希望它生成一个包含与原始字符串相同信息的json字符串,但奇怪的是它只返回字符串{ "employees" : {} }
并完全省略数组并用空对象替换它?
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字符串,它似乎工作正常:
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字符串,它是根节点上的一个数组,它会正确编码/解码,所以我真的开始怀疑这是一个错误(或者至少它是非常不一致的):
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"
}
]
*/
毕竟我决定向微软提出一个问题。让我们看看他们有什么要说的: http://connect.microsoft.com/VisualStudio/feedback/details/779119/data-from-json-decode-is-not-encoded-correctly-when-encoding-with-json-encode
答案 0 :(得分:6)
我也遇到了这个错误,幸运的是这个库现在是开源的,所以我们可以自己修复bug: https://aspnetwebstack.codeplex.com/SourceControl/latest
修复程序位于System.Web.Helpers / DynamicJavaScriptConverter.cs
中// 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 :(得分:0)
我认为你应该使用Json.NET。请参阅:Json.NET on Codeplex
答案 2 :(得分:0)
您是否考虑过创建和使用类,然后可以对它们进行序列化/反序列化?
JavaScriptSerializer serializer = new JavaScriptSerializer();
// to JSON
string json = serializer.Serialize(EmployeeList);
// from JSON
EmployeeList employeeList = serializer.Deserialize<EmployeeList>(json);
我几乎总是序列化/反序列化,因为我需要将数据作为对象在执行期间使用。但我想这取决于你的情况。