2017-01-30 6 views
1

カスタムシリアライザを使用して、C#オブジェクトをjson形式にシリアル化してREST APIで処理します。 APIは、次の形式でデータを受け取ることを期待:別のオブジェクト内でintの配列をシリアライズ

"product": { 
     "sku": "211554", 
     "extras": [{ 
       "code": "cost", 
       "value": "3.99" 
      }, { 
       "code": "start_date", 
       "value": "2017-01-31T14:27:49.3032432+00:00" 
      }, { 
       "code": "end_date", 
       "value": "2017-02-01T14:27:49.3042537+00:00" 
      }, { 
       "code": "ids", 
       "value": [ 
        "1", 
        "2", 
        "3", 
        "19" 
       ] 
      } 
     ] 
    } 

シリアライザの一部がちょうどシリアライザが動作しているよう

"product": { 
      "sku": "211554", 
      "extras": [{ 
        "code": "cost", 
        "value": "3.99" 
       }, { 
        "code": "start_date", 
        "value": "2017-01-31T14:56:05.4683698+00:00" 
       }, { 
        "code": "end_date", 
        "value": "2017-02-01T14:56:05.4693696+00:00" 
       }, { 
        "code": "ids", 
        "value": "System.Int32[]" 
       } 
      ] 
     } 

JsonConvert.SerializeObject(obj, _Settings); 

しかし、結果から結果を返します複雑なネストされたオブジェクト型では問題ありませんが、上記の "ids"セクションのint配列など、単純なネストされた型では問題ありません。

シリアライザを単純なネストされた型で再帰的に動作させるには、何が必要なのでしょうか?私の知る限り、それはあなたのカスタム・シリアライザとは何の関係もないのです言うことができるように

 public class CustomSerializer : ISerializer, IDeserializer 
     { 
      private JsonSerializerSettings _Settings; 

      public CustomSerializer() 
      { 
       ContentType = "application/json"; 

       _Settings = new JsonSerializerSettings 
       { 
        MissingMemberHandling = MissingMemberHandling.Ignore, 
        NullValueHandling = NullValueHandling.Ignore, 
        DefaultValueHandling = DefaultValueHandling.Include 
       }; 
      } 


      public string Serialize(object obj) 
      { 
       var result = JsonConvert.SerializeObject(obj, _Settings); 
       return result; 
      } 

      public T Deserialize<T>(IRestResponse response) 
      { 
       if (response == null) return default(T); 
       if (response.Content.StartsWith("{\"messages\":{")) return default(T); 

       return response.Content == "[]" ? default(T) : JsonConvert.DeserializeObject<T>(response.Content, _Settings); 
      } 

... 

    } 
+4

あなたの使用している*カスタムシリアライザ*から問題が発生していると思われます。 –

+1

JSONの例が無効で、 'obj'がどのように見えるのかわかりません。 – Equalsk

+3

私はserisaliseが値ではなくタイプを取得しているどこかにToString()を持っていると思っています。 – AntDC

答えて

1

UPDATE

はここでカスタム・シリアライザです。私は問題があなたがシリアライズしているクラスとどのようにインスタンスを作成したのかとは思っていますが、私はあなたに確かに伝えることはできません。

私ができることは、正しくシリアル化するクラスをどのように作成したかを示すことです。

シリアライズするクラス:

public class Extra 
    { 
     public string code { get; set; } 
     public object value { get; set; } 
    } 

    public class Product 
    { 
     public string sku { get; set; } 
     public List<Extra> extras { get; set; } 
    } 

    public class RootObject 
    { 
     public Product product { get; set; } 
    } 

は、このクラスのインスタンスを作成します:あなたはすでに示されてきたよう

var root = new RootObject() 
{ 
    product = new Product() 
    { 
     sku = "211554", 
     extras = new List<Extra>() 
     { 
      new Extra() 
      { 
       code = "cost", 
       value = "3.99" 
      }, 
      new Extra() 
      { 
       code = "start_date", 
       value = "2017-01-31T14:27:49.3032432+00:00" 
      }, 
      new Extra() 
      { 
       code = "ids", 
       value = new List<int> {1,2,3,19 } 
      } 
     } 
    } 
}; 

はそれをシリアル化:json

var json = JsonConvert.SerializeObject(root, _Settings); 

出力を:

{ 
"product":{ 
    "sku":"211554", 
    "extras":[ 
    { 
     "code":"cost", 
     "value":"3.99" 
    }, 
    { 
     "code":"start_date", 
     "value":"2017-01-31T14:27:49.3032432+00:00" 
    }, 
    { 
     "code":"ids", 
     "value":[ 
      1, 
      2, 
      3, 
      19 
     ] 
    } 
    ] 
} 
} 
+0

申し訳ありませんが、私が鉱山を投稿したときにあなたの答えを見ませんでした。あなたは高速ですが、私たちは同じページにいると思います:) – CoolBots

+0

上記のシリアライザが呼び出される前に、いくつかのデータフォーマットを処理したより深いレイヤで問題が発生していました。それを適切に管理するための特別なケースが追加されました。今は必要に応じて動作します。私は答えとしてあなたの印をつけました。他人を助けるかもしれない確かな説明ですから。ありがとうEqualsk – Dezzamondo

0

問題は、「エクストラ」プロパティが定義されている方法で、シリアル化される型の定義にある可能性があります。その型を見なければ、私は可能な実装をシミュレートし、あなたが掲示カスタム・シリアライザを使用して、次のテスト:直列化される

public class Product 
{ 
    public string SKU { get; set; } 

    public ExtraInfo[] Extras { get; set; } 

    public class ExtraInfo 
    { 
     public string Code { get; set; } 
     public object Value { get; set; } 
    } 
} 

オブジェクト:

:カスタム・シリアライザを使用して直列

var product = new Product() 
{ 
    SKU = "1234", 
    Extras = new[] 
    { 
     new Product.ExtraInfo() { Code = "cost", Value = 3.99 }, 
     new Product.ExtraInfo() { Code = "ids", Value = new [] { 1, 2, 3 } } 
    } 
}; 

var result = new CustomSerializer().Serialize(product); 

結果のJSON:

{ 
    "SKU":"1234", 
    "Extras":[ 
     { 
     "Code":"cost", 
     "Value":3.99 
     }, 
     { 
     "Code":"ids", 
     "Value":[ 
      1, 
      2, 
      3 
     ] 
     } 
    ] 
} 
関連する問題