【问题标题】:JSON parsing object to string - preserve order of elementsJSON 将对象解析为字符串 - 保留元素的顺序
【发布时间】:2013-03-12 21:01:44
【问题描述】:

我有这个类需要序列化为json:

[DataContract]
public class InfoRequest
{
    [DataMember]
    public string folder_id { get; set; }

    [DataMember]
    public string file_type_id { get; set; }

    [DataMember]
    public string prefix { get; set; }

    [DataMember] 
    public fileInfo[] files;

    [DataMember] 
    public termInfo[] terms;
}

[DataContract]
public class fileInfo
{
    [DataMember] 
    public string name { get; set; }
    [DataMember] 
    public string size { get; set; }
}

[DataContract]
public class termInfo
{
    [DataMember] 
    public string term_id { get; set; }
    [DataMember] 
    public string value { get; set; }
}

我已经尝试过 ServiceStack.Text、NewtonSoft.Json 和 DataContractJsonSerializer。我从每个库中得到不同的结果,它们都没有保留 DataMembers 的顺序。 (ServiceStack 甚至不序列化所有的 DataMembers。) 将相同的 InfoRequest 对象传递给每个库,我得到这些字符串:
JsonConvert:

{
   "files":[
      {
         "name":"Blip.txt",
         "size":"448"
      },
      {
         "name":"blip.jpg",
         "size":"71535"
      }
   ],
   "terms":[
      {
         "term_id":"1000",
         "value":"Copyright"
      },
      {
         "term_id":"1000",
         "value":"Copyright"
      }
   ],
   "folder_id":"11245",
   "file_type_id":"234",
   "prefix":"",
   "ServiceStack":{
      "folder_id":"11245",
      "file_type_id":"234",
      "prefix":""
   },
   "MS":{
      "file_type_id":"234",
      "files":[
         {
            "name":"Blip.txt",
            "size":"448"
         },
         {
            "name":"blip.jpg",
            "size":"71535"
         }
      ],
      "folder_id":"11245",
      "prefix":"",
      "terms":[
         {
            "term_id":"1000",
            "value":"Copyright"
         },
         {
            "term_id":"1000",
            "value":"Copyright"
         }
      ]
   }
}

我怀疑 DataMembers 的顺序应该重要,但我从服务器收到一个错误,我认为这可能是问题所在。
任何见解将不胜感激...

【问题讨论】:

  • 你从服务器得到什么错误。因为是的,数据成员的顺序通常并不重要。因为当您反序列化它时,它会自动转换为该对象
  • 我真的怀疑订单是否重要(除非您正在处理一个非常时髦的服务器应用程序),因此您可能需要在花太多时间处理订单之前测试该理论。尝试按照应用程序当前序列化的方式手动发布 JSON,然后按照您希望的方式重新排列字符串,然后再次发布。这将告诉您错误是否与参数的顺序有关。
  • 我没有看到您设置 DataMembers 的 Order 属性。试试msdn.microsoft.com/en-us/library/…怎么样?
  • JSON 实际上并没有任何固有的成员顺序。它是区分大小写的……或者至少是它在属性名称中保留大小写的 JavaScript 对象。你确定你的属性是正确的吗?

标签: c# json serialization json.net


【解决方案1】:

注意ServiceStack's JSON Serializer 默认情况下仅序列化器公共属性,如果您还想包含公共字段(例如,它也序列化器“文件”和“条款”),您需要包括:

ServiceStack.Text.JsConfig.IncludePublicFields = true;

DataMembers does affect serialization in ServiceStack 使所有字段都选择加入,如果您想退出,请使用 IgnoreDataMember

【讨论】:

    猜你喜欢
    • 2017-01-26
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    相关资源
    最近更新 更多