2017-11-03 5 views
-2

次のjsonには、名前のない配列やその他の名前付きプロパティが含まれています。私はNewtonsoft.Jsonを使ってクラスにデシリアライズする方法を知りたいです。Json arryとその他のプロパティの逆シリアル化(C#)

{ 
    "message": "success", 
    [ 
     { 
      "timestamp": 1509723862, 
      "tid": 84823616, 
      "price": "7344.7", 
      "amount": "0.36108123", 
      "exchange": "bitfinex", 
      "type": "sell" 
     }, 
     { 
      ... 
     } 
    ] 
    } 

私は serializer.DeserializeObject < 一覧<レスポンス>>(serializedObject)を使用して、配列をデシリアライズでき知っているが、JSONは、他のプロパティが含まれているとして、それはJSON-配列文字列ではありません。

私はクラス怒鳴るに、文字列にリストに配列し、「メッセージ」プロパティをデシリアライズするNewtonsoft.Jsonを伝えるために使用できる任意の構成があります:

public class Response 
{ 
    public string Message {get;set;} 
    public List<ResponseItem> ResponseItems {get;set;} 

} 

public class ResponseItem { 
    string timestamp {get;set;} 
    (...) 
} 
+3

?あなたはそれを修正することはできませんか? – CodeCaster

+0

私はこの問題を誤解していると思います。実際、それは常に私に有効なjsonを与えます。私がhttps://api.bitfinex.com/v1/trades/BTCUSDに問い合わせると、有効なjson配列を返します。私がhttps://api.bitfinex.com/v1/trades/BTCUSDxxxを要求すると、それは私に有効なjsonをもう一度与えるが、今回は別のものを与える。私がしようとしているのは、1つのクラス(両方の応答を含む)だけを持つことです。それが可能であるかどうかはわかりません。 – FelipeDrumond

+0

json **は**無効です。https://jsonlint.com/に入れてください。無効なjsonを逆シリアル化することはできません。あなたの最初のステップは、jsonを修正することです – Liam

答えて

1

A JSONができます名前のない配列と名前付きの値の両方が同じレベルにあります。 JSONが無効です。すべてがキーイングされているか、またはキーがない配列です。両方を持つことはできません。

0

2つのJsonを結びつけるのは良い考えではないと思います。独自のデシリアライザを使用して、2 JSONの渡し :

public static class ResponseDeserializer 
{ 
    public static Response Deserialize(string psMessage, string psResponeItems) 
    { 
     dynamic loMessage = JsonConvert.DeserializeObject(psMessage); 

     return new Response() 
     { 
      Message = loMessage.message, 
      ResponseItems = JsonConvert.DeserializeObject<List<ResponseItem>>(psResponeItems) 
     }; 
    } 
} 

をし、それを使用します。なぜあなたは無効なJSONを解析しようとしている

string lsMessage = "{\"message\":\"Unknown symbol\"}"; 
string lsResponseItems = "[{\"timestamp\":1509726632,\"tid\":84840931,\"price\":\"7298.8\",\"amount\":\"0.0044733\",\"exchange\":\"bitfinex\",\"type\":\"sell\"},{\"timestamp\":1509726630,\"tid\":84840921,\"price\":\"7297.3\",\"amount\":\"0.11550649\",\"exchange\":\"bitfinex\",\"type\":\"sell\"},{\"timestamp\":1509726630,\"tid\":84840911,\"price\":\"7297.2\",\"amount\":\"0.0214149\",\"exchange\":\"bitfinex\",\"type\":\"buy\"},{\"timestamp\":1509726629,\"tid\":84840909,\"price\":\"7297.2\",\"amount\":\"0.41004892\",\"exchange\":\"bitfinex\",\"type\":\"buy\"}]"; 

var loResponse = ResponseDeserializer.Deserialize(lsMessage, lsResponseItems); 
Console.WriteLine(loResponse.Message); 
関連する問題