1

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 オブジェクトを渡すと、次の文字列が得られます

{
   "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 の順序は問題ではないと思いますが、サーバーからエラーが発生しており、これが問題である可能性があると考えています。
どんな洞察もいただければ幸いです...

4

1 に答える 1

0

Note ServiceStack の JSON シリアライザーは、デフォルトでシリアライザーのパブリック プロパティのみを使用します。パブリック フィールドも含めたい場合 (たとえば、シリアライザーの 'files' と 'terms' も同様に) を含める必要があります。

ServiceStack.Text.JsConfig.IncludePublicFields = true;

DataMembers は、すべてのフィールドをオプトインにするServiceStack のシリアル化に影響IgnoreDataMemberします。オプトアウトする場合に使用します。

于 2013-03-12T21:29:23.853 に答える