关于c#:为什么Json.Encode无法正确编码从Json.Decode返回的数据?

Why doesn't Json.Encode encode data returned from Json.Decode correctly?

当使用System.Web.Helpers中的Json类并运行以下代码时,我希望它会生成一个json字符串,其中包含与原始字符串相同的信息,但奇怪的是,它仅返回字符串{"employees" : {} }并完全省略了数组并将其替换为空对象?

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