【问题标题】:JsonConvert.DeserializeObject throws exception when deserializing CouchBase response反序列化 CouchBase 响应时,JsonConvert.DeserializeObject 抛出异常
【发布时间】:2020-01-17 20:08:09
【问题描述】:

我正在尝试反序列化来自 CouchBase 的 JSON 响应。但是,反序列化会引发异常。

            IQueryRequest queryRequest = QueryRequest.Create(queryString);
            queryRequest.ScanConsistency(ScanConsistency.RequestPlus);
            var queryResult = await bucket.QueryAsync<dynamic>(queryRequest);

            if (!queryResult.Success)
            {
            }

            foreach (var row in queryResult.Rows)
            {
                try
                {
                    var registrationDetails = JsonConvert.DeserializeObject<IEnumerable<RegistrationModel>>(row);
                    //var registrationDetail1 = JsonConvert.DeserializeObject<RegistrationModel>(row);
                }
                catch (Exception Ex)
                { }

            }

我得到的异常:

{Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: The best overloaded method match for 'Newtonsoft.Json.JsonConvert.DeserializeObject<System.Collections.Generic.IEnumerable<MC4B_CommonInterface.RegistrationModel>>(string)' has some invalid arguments
   at CallSite.Target(Closure , CallSite , Type , Object )
   at System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0,T1,TRet](CallSite site, T0 arg0, T1 arg1)
   at DataAccess.Services.RegistrationDataServices.ActivateSimpleRegistrations(ActivateRequest request) ...}

Couchbase 的回应很简单。 RegistrationModel 具有所有 JsonProperty 属性。

[
  {
    "acsPntDocId": "",
    "adLis": "[]",
    "adP2DNa": "CA",
     .....
    }
]

我注意到,foreach (var row in queryResult.Rows)row 包含 {{"acsPntDocId":"","adLis": "[]", ...}}

【问题讨论】:

  • 不能反序列化成接口。你必须指定一个具体的实现,比如List&lt;T&gt;
  • adLis 应该是一个集合吗?如果是这样 JSON/ 你的模型是错误的。发布您的模型。
  • 在此处查看答案:stackoverflow.com/questions/41266503/… 该行对象可能已经是 JObject。
  • @newprint 你确定变量 row 是一个字符串吗?如果不是,您将从 newtonsoft json 收到错误。请验证该行实际上是一个字符串
  • @newprint 您正在动态调用 JsonConvert.DeserializeObject。这在编译时不会失败,但在运行时会抛出,因为该方法的动态绑定失败(该方法需要一个字符串,但您传递的对象不是字符串)

标签: c# json asp.net-core json.net couchbase


【解决方案1】:

根据您在问题末尾发布的字符串结果,row 可能已经是一个 JObject。根据这篇帖子https://stackoverflow.com/a/44308752/579148,似乎在反序列化之前将.ToString() 添加到jobject 可能对你有用。

例如:

string rowString = row.ToString();
var registrationDetails = JsonConvert.DeserializeObject<IEnumerable<RegistrationModel>>(rowString);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多