Newtonsoft Json 个动态对象

Newtonsoft Json dynamic objects

我正在尝试访问 foreach 中 ETH_MOD 等的值,以输出 ETH_MOD 之类的名称和最后一个值。 问题是像 ETH_MOD 和 ETH_LTG 这样的键是动态的。它们会不时更改,还会添加更多新对。

希望有人理解我的问题并能提供帮助 ;)

在php我是这样做的。这里我在 $key

中有 "Name"
$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": []
  }
}

这会给你一个提示(我把你的 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
    }

您可以将 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 对象。

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

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

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