Newtonsoft Json动态对象

时间:2017-10-30 11:32:56

标签: c# json.net ethereum

我试图在foreach中访问ETH_MOD等的值,输出名称如ETH_MOD和最后一个值。 问题是像ETH_MOD和ETH_LTG这样的键是动态的。它们会不时变化,并且还会添加更多新对。

希望有人理解我的问题,可以提供帮助;)

在php中我正在这样做。在这里,我有"姓名"在$ key

$cls = json_decode($json);
foreach ($cls as $key => $value) {  
    $last= transformNumber($value->last);
    $bid= transformNumber($value->bid);
    $ask= transformNumber($value->ask);
}

亲切的问候



{
  "returnTicker": {
    "ETH_MOD": {
      "tokenAddr": "0x957c30ab0426e0c93cd8241e2c60392d08c6ac8e",
      "quoteVolume": 401812,
      "baseVolume": 2398.702,
      "last": 0.005690802,
      "percentChange": 0.0737,
      "bid": 0.005650001,
      "ask": 0.00579
    },
    "ETH_LTG": {
      "tokenAddr": "0x0879e0c9822b75f31f0b0ed2a30be9f484a57c2f",
      "quoteVolume": 35336143,
      "baseVolume": 1767.741,
      "last": 4.9993E-05,
      "percentChange": 3.1661,
      "bid": 4.65E-05,
      "ask": 4.874E-05
    },
    "ETH_ATM": {
      "tokenAddr": "0x9b11efcaaa1890f6ee52c6bb7cf8153ac5d74139",
      "quoteVolume": 9114955.042,
      "baseVolume": 1641.045,
      "last": 0.000177983,
      "percentChange": -0.0167,
      "bid": 8.0009E-05,
      "ask": 8.38E-05
    },
    "ETH_VERI": {
      "tokenAddr": "0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374",
      "quoteVolume": 3632.34,
      "baseVolume": 617.863,
      "last": 0.164501,
      "percentChange": -0.015,
      "bid": 0.168,
      "ask": 0.1695
    },
    "ETH_ITS": {
      "tokenAddr": "0xfd784da5c740c617aafb80399fa81b86e1da99a5",
      "quoteVolume": 206921.3,
      "baseVolume": 124.563,
      "last": 0.000506,
      "percentChange": 0.3316,
      "bid": 0.0002667,
      "ask": 0.0005588
    }
  },
  "trades": [],
  "orders": {
    "buys": [],
    "sells": []
  }
}




2 个答案:

答案 0 :(得分:3)

这会给你一个提示(我把你的JSON放在rawJson字符串变量中):

using Newtonsoft.Json.Linq;//use Nuget to get Newtonsoft package

    ...
    ...

   dynamic task = JObject.Parse(rawJson);
   var ticker = task.returnTicker;
   foreach (var pair in ticker)
   {              
     Console.WriteLine(pair.Name); //ETH_MOD and others 
     Console.WriteLine(pair.Value);//JSONs with details
    }

答案 1 :(得分:0)

您可以将returnTicker标记为:

[JsonProperty]
private IDictionary<string, JToken> returnTicker;

如果您想从中获取基础数据,可以将其投射到所需的对象:

foreach (var pair in returnTicker) {
  if ("ETH_MOD" == pair.Key) {
  MyEHT_MOD_class object = pair.Value.ToObject<MyEHT_MOD_class>();
  ... // use object
  }
  ...
}

然后只使用包含所需字段的MyEHT_MOD_class对象。

如果您的对象中可能有额外的元素,并且您不想错过它,则可以将某些fild标记为:

[JsonExtensionData]
private IDictionary<string, JToken> extraStuff;

通常,声明为 JsonProperty 并使用您需要的字段。如果有一些你没有使用的新字段那么没关系,你可以检查_extraStuff并通知用户。