【问题标题】:Why doesn't Json.Encode encode data returned from Json.Decode correctly?为什么 Json.Encode 不能正确编码从 Json.Decode 返回的数据?
【发布时间】:2013-02-13 09:23:51
【问题描述】:

当使用 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"
    }
]
*/

更新 2

毕竟,我决定向 Microsoft 提出问题。让我们看看他们怎么说: http://connect.microsoft.com/VisualStudio/feedback/details/779119/data-from-json-decode-is-not-encoded-correctly-when-encoding-with-json-encode

【问题讨论】:

  • 我不是这个库的专家,但一切看起来都很干净,所以我认为它是一个错误。但数组处理是 JSON 中的基本功能,我无法相信他们不会没注意到..

标签: c# .net json


【解决方案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 on Codeplex

    【讨论】:

    • 这不能回答这个问题,它是关于特定库中的特定问题,而不是关于编码 json 的最佳方式。
    【解决方案3】:

    您是否考虑过创建和使用类,然后您可以对它们进行序列化/反序列化?

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

    我几乎总是序列化/反序列化,因为我需要将数据作为对象在执行期间使用。但我想这取决于你的情况。

    【讨论】:

      猜你喜欢
      • 2019-04-30
      • 1970-01-01
      • 1970-01-01
      • 2019-11-22
      • 1970-01-01
      • 1970-01-01
      • 2021-10-30
      • 2019-01-08
      相关资源
      最近更新 更多