提取JSON信息并放入对象

时间:2018-03-28 16:50:43

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

到目前为止,我通过填充的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对象反序列化。

3 个答案:

答案 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对象不匹配。两者必须匹配,否则反序列化将失败。如果您不想要errorMessagessuccess,而您关心的只是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对象,其premiumAnnualstring。最好将其更改为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;