【问题标题】:C#.Net JSON Serialization not workingC#.Net JSON 序列化不起作用
【发布时间】:2016-05-04 08:56:50
【问题描述】:

谁能告诉我为什么反序列化这个 JSON 响应时会出错?

    public T PostData<T>(string command, Dictionary<string, object> postData)
    {
        postData.Add("command", command);
        postData.Add("nonce", Helper.GetCurrentHttpPostNonce());

        var jsonString = PostString(Helper.ApiUrlHttpsRelativeTrading, postData.ToHttpPostString());
        var output = JsonSerializer.DeserializeObject<T>(jsonString);

        return output;
    }

    [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)) {
                /*   
                    An exception of type 'Newtonsoft.Json.JsonSerializationException' occurred in Newtonsoft.Json.dll but was not handled in user code
                    Additional information: Could not create an instance of type Jojatekok.PoloniexAPI.WalletTools.IBalance. Type is an interface or abstract class and cannot be instantiated. Path '1CR.available', line 1, position 20. 

                    ERROR's ON NEXT LINE :
                */
                return (T)serializer.Deserialize(jsonTextReader, typeof(T));
            }
        }
    }

返回的字符串值为: {"1CR":"available":"0.00000000","onOrders":"0.00000000","btcValue":"0.00000000"}}

我有一个天平接口:

public interface IBalance
{
    double QuoteAvailable { get; }
    double QuoteOnOrders { get; }
    double BitcoinValue { get; }
}

还有一个平衡模型:

public class Balance : IBalance
{
    [JsonProperty("available")]
    public double QuoteAvailable { get; private set; }
    [JsonProperty("onOrders")]
    public double QuoteOnOrders { get; private set; }
    [JsonProperty("btcValue")]
    public double BitcoinValue { get; private set; }
}

虽然它没有将 JSON 反序列化为 Balance 对象。我收到此错误:

(An exception of type 'Newtonsoft.Json.JsonSerializationException' occurred in Newtonsoft.Json.dll but was not handled in user code
Additional information: Could not create an instance of type Jojatekok.PoloniexAPI.WalletTools.IBalance. Type is an interface or abstract class and cannot be instantiated. Path '1CR.available', line 1, position 20.)

此错误在发生的代码中注明。
有什么建议吗?

【问题讨论】:

  • 我猜你打电话给DeserializeObject&lt;IBalance&gt;,但它一定是DeserializeObject&lt;Balance&gt;。为什么你不使用JsonConvert
  • 嗨,Maxim,您能说明如何在这种情况下使用 JsonConvert 吗?

标签: c# .net json serialization json-deserialization


【解决方案1】:

我可以看到返回的 JSON 字符串中有两个右括号:

{"1CR":"available":"0.00000000","onOrders":"0.00000000","btcValue":"0.00000000"}}

使用正确的 JSON 格式字符串获取 JSON.DeserializeObject&lt;T&gt; 它,我认为它应该可以工作。

【讨论】:

  • 您好 Kunal,为简洁起见,我复制/粘贴了一个 json 节点,实际返回的 JSON 太大,无法放在这里。我一定是不小心把结束括号放进去了。假设 JSON 格式正确
【解决方案2】:

Maxim Kosov 的评论和 Kunal Chitkara 的回答似乎都是正确的,我会添加字符串中的第一个标记

"1CR":"available":"0.00000000"

好像也不对,应该只是

"available":"0.00000000"

在您的原始代码中,注释提到这是错误的可能原因:

路径“1CR.available”,第 1 行,位置 20。

【讨论】:

  • 嗨 Carlos,为了简洁起见,我复制/粘贴了一个 json 节点,返回的实际 JSON 太大,无法放在这里。我一定是不小心把结束括号放进去了。假设 JSON 格式正确
猜你喜欢
  • 2012-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多