到目前为止,我通过填充的JSON从我的服务获得了有效的响应。我的问题是我应该如何解析JSON以便将pAnn
放入我的对象中。我正在设计这个以供将来使用,因为我需要将更多的值从这个JSON分配给对象。如果有更简单的方法,请告诉我。
public IEnumerable<CP> GetP()
{
string pURL, getPResult;
var handler = new HttpClientHandler();
handler.Credentials = new NetworkCredential("username", "password");
using (HttpClient client = new HttpClient(handler))
{
pURL = String.Concat(validurl + 5854);
client.BaseAddress = new Uri(pURL);
HttpResponseMessage result = client.GetAsync(client.BaseAddress).Result;
if (!result.IsSuccessStatusCode)
{
throw new WebException();
}
else
{
getPResult = result.Content.ReadAsStringAsync().Result;
}
var pDetails = JsonConvert.DeserializeObject<List<CP>>(getPResult);
IEnumerable<CP> pResults = from cOpt in pDetails
select new CP
{
pAnn = cO.pAnn
};
return pResults;
}
}
这是我的目标:
public class CP
{
public string pAnn { get; set; }
}
这是我收到的JSON信息:
{"data":{.... "cO":[{..... "pAnn":11111.11 .... },"errorMessages":[],"success":true}
我在JsonConvert.DeserializeObject
行收到错误:
发生Newtonsoft.Json.JsonSerializationException消息=无法 将当前JSON对象(例如{“name”:“value”})反序列化为类型 'System.Collections.Generic.List因为类型需要JSON 数组(例如[1,2,3])正确反序列化。要修复此错误 要么将JSON更改为JSON数组(例如[1,2,3]),要么更改 反序列化类型,以便它是一个普通的.NET类型(例如,不是 原始类型,如整数,而不是像数组或类似的集合类型 List)可以从JSON对象反序列化。 JsonObjectAttribute也可以添加到类型中以强制它 从JSON对象反序列化。
答案 0 :(得分:0)
您的数据示例结构是有效的json格式。
{"data":{"coverageOptions":[{"premiumAnnual":11257.9284 }],"errorMessages":[],"success":true}}
我认为你的样本喜欢上面。
public class CoveragePremium
{
public string premiumAnnual { get; set; }
}
public class CoverageOption
{
public double premiumAnnual { get; set; }
}
public class Data
{
public List<CoverageOption> coverageOptions { get; set; }
public List<string> errorMessages { get; set; }
public bool success { get; set; }
}
public class ResultObject
{
public Data data { get; set; }
}
static void Main(string[] args)
{
string getPremiumResult = "{\"data\":{\"coverageOptions\":[{\"premiumAnnual\":11257.9284 }],\"errorMessages\":[],\"success\":true}}";
var result = JsonConvert.DeserializeObject<ResultObject>(getPremiumResult);
IEnumerable<CoveragePremium> premiumResults = from value in result.data.coverageOptions
select new CoveragePremium
{
premiumAnnual = value.premiumAnnual.ToString(CultureInfo.InvariantCulture)
};
Console.ReadKey();
}
我希望这种结构符合您的需求
答案 1 :(得分:0)
您收到的错误很明显。您获得的JSON只有一个对象,而您正在尝试将其反序列化为列表List<CoveragePremium>
。我会告诉你删除List<>
:
var premiumDetails = JsonConvert.DeserializeObject<CoveragePremium>(getPremiumResult);
但这不起作用,因为您的CoveragePremium
课程与您正在获得的JSON对象不匹配。两者必须匹配,否则反序列化将失败。如果您不想要errorMessages
和success
,而您关心的只是premiumAnnual
coverageOptions
,那么您需要创建这些类和属性最小:
public class RootObject {
public Data data { get; set; }
}
public class Data {
public List<CoverageOption> coverageOptions { get; set; }
//If you want to include the other properties, uncomment the lines below:
//public List<string> errorMessages { get; set; }
//public bool success { get; set; }
}
public class CoverageOption {
public decimal premiumAnnual { get; set; }
}
现在您可以将您的行更改为:
var premiumDetails = JsonConvert.DeserializeObject<RootObject>(getPremiumResult);
但是,在您的LINQ中,您将premiumAnnual
选择为CoveragePremium
对象,其premiumAnnual
为string
。最好将其更改为decimal
,以便稍后可以将该值用作数字而不是字符串:
public class CoveragePremium {
public decimal premiumAnnual { get; set; }
}
答案 2 :(得分:0)
为了避免在.NET中创建JSON类时出错,您可以复制JSON文件并转到Visual Studio =&gt; Edit =&gt; Paste Special =&gt;粘贴JSON作为类。完成后,它会将您的JSON格式文件转换为类:
public class Rootobject
{
public Data data { get; set; }
}
public class Data
{
public Coverageoption[] coverageOptions { get; set; }
public object[] errorMessages { get; set; }
public bool success { get; set; }
}
public class Coverageoption
{
public float premiumAnnual { get; set; }
}
string yourJsonString= "{"data":{"coverageOptions":[{"premiumAnnual":11257.9284 }],"errorMessages":[],"success":true}}";
var result = JsonConvert.DeserializeObject<Rootobject>(yourJsonString);
现在您可以按以下方式访问您的数据:
var ifSuccess = result.data.success;
var coverageOption = result.data.coverageOptions[0].premiumAnnual;