将JSON对象转换为字典

时间:2018-04-22 14:06:55

标签: c# json api

我正在调用ethplorer.io api,它会返回下面的json。我已经在visual studio中通过“粘贴特殊”生成了这些类 - >将json粘贴为类'。我的问题是Tokeninfo将price声明为一个对象,这是因为如果它没有价格信息它可能是假的,或者如果它有值,它可以是字典。虽然我已经使用JsonConvert.DeserializeObject(rawJSON)成功地对响应进行了反序列化,但是如果它有值,我很难将价格转换为c#字典。

public class Tokeninfo
{
    public string address { get; set; }
    public string name { get; set; }
    public object decimals { get; set; }
    public string symbol { get; set; }
    public string totalSupply { get; set; }
    public string owner { get; set; }
    public long lastUpdated { get; set; }
    public int issuancesCount { get; set; }
    public int holdersCount { get; set; }
    public object price { get; set; }
    public string description { get; set; }
    public float totalIn { get; set; }
    public float totalOut { get; set; }
}

JSON回复:

{
  "address": "0xd8f41f341afe2c411b21b3f96263c6584b69baeb", //Not my address
  "ETH": {
    "balance": 762.13611095505,
    "totalIn": 1040.0907032491,
    "totalOut": 277.954592294
  },
  "countTxs": 22,
  "tokens": [
    {
      "tokenInfo": {
        "address": "0x355a458d555151d3b27f94227960ade1504e526a",
        "name": "StockChain Coin",
        "decimals": "18",
        "symbol": "SCC",
        "totalSupply": "10000000000000000000000000000",
        "owner": "0x",
        "lastUpdated": 1524401998,
        "issuancesCount": 0,
        "holdersCount": 86520,
        "price": {
          "rate": "0.0531126",
          "diff": 4.8,
          "diff7d": 19.82,
          "ts": "1524400762",
          "marketCapUsd": null,
          "availableSupply": null,
          "volume24h": "622004.0",
          "currency": "USD"
        }
      },
      "balance": 5000000000000000000,
      "totalIn": 0,
      "totalOut": 0
    },
    {
      "tokenInfo": {
        "address": "0xb679afd97bcbc7448c1b327795c3ef226b39f0e9",
        "name": "Win Last Mile",
        "decimals": "6",
        "symbol": "WLM",
        "totalSupply": "2000000000000000",
        "owner": "0x8e7a75d5e7efe2981ac06a2c6d4ca8a987a44492",
        "lastUpdated": 1524362946,
        "issuancesCount": 0,
        "holdersCount": 10945,
        "price": false
      },
      "balance": 66000000,
      "totalIn": 0,
      "totalOut": 0
    },
    {
      "tokenInfo": {
        "address": "0xae66d00496aaa25418f829140bb259163c06986e",
        "name": "Super Wallet Token",
        "decimals": "8",
        "symbol": "SW",
        "totalSupply": "8400000000000000",
        "owner": "0xba051682e9dbc40730fcef4a374e3a57a0ce3eff",
        "lastUpdated": 1524401948,
        "issuancesCount": 0,
        "holdersCount": 30276,
        "price": false
      },
      "balance": 11567900,
      "totalIn": 0,
      "totalOut": 0
    },
    {
      "tokenInfo": {
        "address": "0x8e4fbe2673e154fe9399166e03e18f87a5754420",
        "name": "Universal Bonus Token | t.me/bubbletonebot",
        "decimals": "18",
        "symbol": "UBT",
        "totalSupply": "1150000000000000000000000",
        "owner": "0xc2db6e5b96dd22d9870a5ca0909cceac6604e21d",
        "lastUpdated": 1524393745,
        "issuancesCount": 0,
        "holdersCount": 99896,
        "price": false
      },
      "balance": 10000000000000000000,
      "totalIn": 0,
      "totalOut": 0
    }
  ]
}

2 个答案:

答案 0 :(得分:2)

您需要自定义反序列化器来执行您想要的操作。它应该是直截了当的。以下是一些代码,用于检查price是否不是false,然后将其转换为Dictionary<string, string>。此代码假设您的根对象名为RootObject

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
    var jsonObject = JObject.Load(reader);
    var root = default(Rootobject);

    // Let's go through each tokenInfo and check if price is not false
    // so we can turn it into a dictionary.
    foreach (var thisToken in root.tokens)
    {
        if (thisToken.tokenInfo.price.ToString() != "false")
        {
            thisToken.tokenInfo.price = JsonConvert.DeserializeObject<Dictionary<string, string>>(thisToken.tokenInfo.price.ToString()); 
        }
    }

    serializer.Populate(jsonObject.CreateReader(), root);
    return root;
}

请参阅完整示例here并在该链接中搜索完整课程的 ProfessionConverter

答案 1 :(得分:0)

我认为在没有价格的情况下使用false并不是一个很好的方法。如果没有价格,它应该是"price" :{}或价格元素不应该存在。换句话说,混合boolean objectdictionaty imho不是一个好主意。

我认为您可以使用VisualStudio类提供的Priceobject。您可以创建一个自定义序列化程序,将false视为null(或具有空字段的对象)以及标准的反序列化机制。