【问题标题】:Error when explicit converting Newtonsoft.Json.Linq.JObject with dynamic data使用动态数据显式转换 Newtonsoft.Json.Linq.JObject 时出错
【发布时间】:2018-03-20 15:01:10
【问题描述】:

我正在尝试反序列化以下 json:

{
"oxide":{
    "Al2O3":"0.3",
    "CaO":"0.3",
    "FeO":"0.3",
    "MgO":"0.3",
    "MnO":"0.3",
    "SiO2":"0.3"
},
"temperature": "1800"

}

当我以这种方式转换时,一切正常:

        Oxides oxides = new Oxides();
        string oxidequery = req.Query["oxide"];
        string temperature = req.Query["temperature"];

        string requestBody = new StreamReader(req.Body).ReadToEnd();
        dynamic data = JsonConvert.DeserializeObject(requestBody);
        oxide.Al2O3 = data?.oxide.Al2O3;
        oxide.CaO = data?.oxide.CaO;
        oxide.FeO = data?.oxide.FeO;
        oxide.MgO = data?.oxide.MgO;
        oxide.MnO = data?.oxide.MnO;
        oxide.SiO2 = data?.oxide.SiO2;
        double tempDouble = temperature ?? data?.temperature;

但是当我这样做时它不起作用:

        Oxides oxides = new Oxides();
        string oxidequery = req.Query["oxide"];
        string temperature = req.Query["temperature"];

        string requestBody = new StreamReader(req.Body).ReadToEnd();
        dynamic data = JsonConvert.DeserializeObject(requestBody);
        oxide = (Oxides)data?.oxide;
        double tempDouble = temperature ?? data?.temperature;

在第二种方法中我得到了错误

无法将类型“Newtonsoft.Json.Linq.JObject”转换为“氧化物”。

我错过了什么?我已经搜索过,发现我必须显式转换data.oxide,但我已经在这样做了。

【问题讨论】:

标签: c# json json.net


【解决方案1】:

试试这个:

dynamic data = JsonConvert.DeserializeObject<dynamic>(requestBody);
oxide = ((JObject)data?.oxide).ToObject<Oxides>();

【讨论】:

    【解决方案2】:

    我相信您的问题是您在哪里执行Stream 以读取动态。当我遇到类似的问题时,我作为一个对象返回。

        public object DownloadFromApi(string url)
        {
            if (WebRequest.Create(url) is HttpWebRequest request)
            {
                request.Method = "GET";
                request.ContentType = "application/json";
    
                try
                {
                    using (Stream response = request.GetResponse().GetResponseStream())
                        if (response != null)
                            using (var reader = new StreamReader(response))
                                return JsonConvert.DeserializeObject(reader.ReadToEnd());
                }
    
                catch (HttpRequestException exception)
                {
                    ApplicationProvider.Log.Error($"An unhandled HTTP error has occurred.{Environment.NewLine}{exception.Message}");
                    throw new Exception(exception.Message);
                }
            }
    
            ApplicationProvider.Log.Error($"Web request failed due to null value. {url}");
            throw new Exception($"A null parameter or response has occurred for {url}");
        }
    

    这种转换似乎解决了我的问题,即对象被错误地反序列化为不正确的类型。所以我能够执行以下操作来读入我的对象。

        private static IEnumerable<AssetDataModel> GetAllDataForAsset(AssetModel asset)
        {
            dynamic apiResponse = new ApiRequestUtility().DownloadFromApi(optiAssetDataWithinRangeUrl);
            for (var index = 0; index != apiResponse.Items.Count; index++)
                yield return new AssetDataModel
                {
                    Id = apiResponse["Items"][index].id,
                    ResourceId = apiResponse["Items"][index].value[0].resourceId,
                    Timestamp = apiResponse["Items"][index].timeValue,
                    Value = apiResponse["Items"][index].value[0].value
                };
        }
    

    当我迭代响应以构建我的数据集合时,这允许正确的转换。因此,一些尝试反序列化为浮点数而不是小数的奇怪尝试似乎在我们的实验室数据中得到缓解。

    还想指出,作为对象返回,但返回类型仍然是动态的,需要在运行时确定。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-30
      • 1970-01-01
      相关资源
      最近更新 更多