Почему Json.Encode не кодирует данные, возвращенные из Json.Decode правильно?

Когда я использую класс Json из System.Web.Helpers, и я запускаю следующий код, я ожидал, что он создаст строку 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, но не нашел причин, почему это не должно работать. Может быть, это ошибка или она по дизайну?

Update

Если у меня есть строка json, которая имеет массив в корневом каталоге node, она кодирует/декодирует правильно, поэтому я действительно начинаю подозревать, что это ошибка (или, по крайней мере, это очень противоречиво):

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

Ответ 1

Я тоже испытываю эту ошибку, к счастью, теперь библиотека открыта с открытым исходным кодом, поэтому мы можем исправить ошибку: 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

Ответ 2

Я думаю, вы должны использовать Json.NET. Смотрите: Json.NET на Codeplex

Ответ 3

Задумывались ли вы о создании и использовании классов, которые вы затем можете сериализовать/десериализовать?

JavaScriptSerializer serializer = new JavaScriptSerializer();
// to JSON
string json = serializer.Serialize(EmployeeList);
// from JSON
EmployeeList employeeList = serializer.Deserialize<EmployeeList>(json);

Я почти всегда сериализую/десериализую, потому что мне нужны данные как объект для использования во время выполнения. Но я думаю, это зависит от вашего дела.