C#JSON反序列化:类型是接口或抽象类,不能实例化

C#JSON反序列化:类型是接口或抽象类,不能实例化,c#,json,json-deserialization,C#,Json,Json Deserialization,我正在使用这个C#项目,它使用 此代码用于获取钱包中的余额: var x = await polo_client.Wallet.GetBalancesAsync(); 尽管此代码给出了此错误: 获取钱包时出错:无法创建Jojatekok.PoloniexAPI.WalletTools.iBlance类型的实例。 类型是接口或抽象类,无法实例化。 路径“1CR可用”,第1行,位置20 在Helper.cs中: [SuppressMessage("Microsoft.Usage", "CA2202

我正在使用这个C#项目,它使用

此代码用于获取钱包中的余额:

var x = await polo_client.Wallet.GetBalancesAsync();
尽管此代码给出了此错误:

获取钱包时出错:无法创建Jojatekok.PoloniexAPI.WalletTools.iBlance类型的实例。
类型是接口或抽象类,无法实例化。
路径“1CR可用”,第1行,位置20

在Helper.cs中:

[SuppressMessage("Microsoft.Usage", "CA2202:Do not dispose objects multiple times")]
internal static T DeserializeObject<T>(this JsonSerializer serializer, string value)
{ 
    using (var stringReader = new StringReader(value))
    {
        using (var jsonTextReader = new JsonTextReader(stringReader))
        {
            return (T)serializer.Deserialize(jsonTextReader, typeof(T));
        }
    } 
}

不管是否使用JSON,错误都是自描述的。不能实例化接口或抽象类。它们只是它们所代表的功能或对象结构的蓝图

例如,您不能执行以下操作:

var something = new ISomething();
但是,您可以这样做:

ISomething something = new Something();
您所需要的只是该接口的一些具体实现。比如:

public JsonReceived : IBalance
{
// rest of the implementation
}

或者可能已经由第三方提供,请查看其SDK文档。

由于对象的反序列化而导致的错误,该对象在内部创建Jobject并将其转换为输入泛型,在上述场景中,因为我们无法创建接口的对象,因此它会引发错误, 根据您在GitHub发布的解决方案,我们可以通过以下方式实现

  • 添加哈希表作为PostData方法的一般输入
  • 将您的钱包更改为 例:

    需要改变平衡类

     public Balance : BalanceBase
        {
        }
    
  • 如果iBlance除了balance之外没有实现其他类
  • 您可以直接为GetBalance()方法使用返回类型 作为词典 并改变实施方式

     private IDictionary<string, Balance> GetBalances()
            {
    
                var postData = new Dictionary<string, object>();
                var data = PostData<IDictionary<string, Balance>>("returnCompleteBalances", postData);
    
                return data;
            }
    
    private IDictionary GetBalances()
    {
    var postData=新字典();
    var数据=PostData(“returnCompleteBalances”,PostData);
    返回数据;
    }
    
    这就是我为让它工作所做的。感谢Guru.com上的Chris让这一切顺利进行。很棒的家伙,价格也很好。你可以在这里找到他:

    private IDictionary GetBalances()
    {
    var postData=新字典();
    var数据=PostData(“returnCompleteBalances”,PostData);
    var returnData=newdictionary();
    foreach(data.Keys中的字符串键)
    {
    returnData.Add(key,data[key]);
    }
    返回数据;
    }
    
    你能添加调用泛型反序列化函数的代码吗?我只是不习惯泛型,已经一年多没有用C语言编程了,所以我仍然掌握着它们的窍门。如果您查看描述中链接中的示例代码,您可能会很快找到它。ApiWebClient.cs是调用代码,Helper.cs是反序列化代码查看github,我可以看到它们有IBalance的具体实现。因此,只需替换IBalance以在调用代码中保持平衡即可。我所用的就是调用他们的代码:var x=wait polo_client.Wallet.GetBalancesAsync();可能是他们的代码出了问题。private IDictionary GetBalances()应该是private IDictionary GetBalances(),感谢您的解决方案,尽管我已经得到了一个更简单的解决方案,它对我来说非常有效。
    IBalance CreateFactory(string typeOfBalance, string jsonString)
            {
                IBalance balance = null;
                switch (typeOfBalance)
                {
                    case "balanceClassIdentification":
                        balance = new Balance();
                        balance = Newtonsoft.Json.JsonConvert.DeserializeObject<Balance>(jsonString);
                        break;
                    case "":
                    // write logic if Ibalance interface implemented in any childClass ex: class stockBalance: IBalance , then balance = new StockBalance();balance = Newtonsoft.Json.JsonConvert.DeserializeObject<stockBalance>(jsonString);
                    default:
                        balance = new Balance();
                        balance = Newtonsoft.Json.JsonConvert.DeserializeObject<Balance>(jsonString);
                        break;
                }
                return balance;
            }
            private IDictionary<string, IBalance> GetBalances()
            {
                IDictionary<string, IBalance> data = null;
                var postData = new Dictionary<string, object>();
                //var data = PostData<IDictionary<string, object>>("returnCompleteBalances", postData);
    
                Hashtable output = PostData<Hashtable>("returnCompleteBalances", postData);
                if (output.Count > 0)
                {
    
                    data = new Dictionary<string, IBalance>();
                }
                foreach (string jsonObjKey in output.Keys)
                {
                    IBalance balace = CreateFactoty("balanceClassIdentification", output[jsonObjKey].ToString()); // this "balanceClassIdentification" just used as a string but we can add the condition in createFactory according to the type of object that wallet
    
                    data.Add(jsonObjKey, balace);
                }
                return data;
            }
    
    public class BalanceBase: IBalace
     {
     } 
    
     public Balance : BalanceBase
        {
        }
    
     private IDictionary<string, Balance> GetBalances()
            {
    
                var postData = new Dictionary<string, object>();
                var data = PostData<IDictionary<string, Balance>>("returnCompleteBalances", postData);
    
                return data;
            }
    
    private IDictionary<string, IBalance> GetBalances()
    {
        var postData = new Dictionary<string, object>();
        var data = PostData<IDictionary<string, Balance>>("returnCompleteBalances", postData);
        var returnData = new Dictionary<string, IBalance>();
    
        foreach (string key in data.Keys)
        {
            returnData.Add(key, data[key]);
        }
    
        return returnData;
    }