【问题标题】:How to read JSON response?如何读取 JSON 响应?
【发布时间】:2014-06-16 09:32:06
【问题描述】:

我有一个 API 可以验证手机并返回 JSON 数据。现在我想读取 JSON 并以表格格式显示。

API 调用,

protected void CallAPI()
{
    WebClient wsClient = new WebClient();
    string url = apiUrl;
    string response = string.Empty;
    string serialkey = txtserialNumber.Text;
    WebRequest req = WebRequest.Create(@"https://alt.computechsos.com/api/v1/xx");
    req.Method = "POST";
    req.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.Default.GetBytes("username:@password"));
    HttpWebResponse resp = req.GetResponse() as HttpWebResponse;
    WebHeaderCollection header = resp.Headers;
    string responseText = string.Empty;
    var encoding = ASCIIEncoding.ASCII;
    using (var reader = new System.IO.StreamReader(resp.GetResponseStream(), encoding))
    {
       responseText = reader.ReadToEnd();
    }

}

“responseText”现在包含以下JSON

Json 返回响应:

{"ios_info":{"serialNumber":"F2LLMBNJXXXQ","imeiNumber":"0138840041323XX","meid":"","iccID":"890141042764009604XX","firstUnbrickDate":"11\/27\/13","lastUnbrickDate":"11\/27\/13","unbricked":"true","unlocked":"false","productVersion":"7.1.1","initialActivationPolicyID":"23","initialActivationPolicyDetails":"US AT&T Puerto Rico and US Virgin Islands Activation Policy","appliedActivationPolicyID":"23","appliedActivationDetails":"US AT&T Puerto Rico and US Virgin Islands Activation Policy","nextTetherPolicyID":"23","nextTetherPolicyDetails":"US AT&T Puerto Rico and US Virgin Islands Activation Policy","macAddress":"ACFDEC6C9XXX","bluetoothMacAddress":"AC:FD:EC:6C:98:8B","partDescription":"IPHONE 5S SPACE GRAY 64GB-USA"},"product_info":{"serialNumber":"F2LLMBNJXXXQ","warrantyStatus":"Apple Limited Warranty","coverageEndDate":"11\/25\/14","coverageStartDate":"11\/26\/13","daysRemaining":"528","estimatedPurchaseDate":"11\/26\/13","purchaseCountry":"United States","registrationDate":"11\/26\/13","imageURL":"http:\/\/service.info.apple.com\/parts\/service_parts\/na.gif","explodedViewURL":"http:\/\/service.info.apple.com\/manuals-ssol.html","manualURL":"http:\/\/service.info.apple.com\/manuals-ssol.html","productDescription":"iPhone 5S","configDescription":"IPHONE 5S GRAY 64GB GSM","slaGroupDescription":"","contractCoverageEndDate":"11\/25\/15","contractCoverageStartDate":"11\/26\/13","contractType":"C1","laborCovered":"Y","limitedWarranty":"Y","partCovered":"Y","notes":"Covered by AppleCare+ - Incidents Available","acPlusFlag":"Y","consumerLawInfo":{"serviceType":"","popMandatory":"","allowedPartType":""}}}

如何读取这个 JSON 并以表格格式显示数据?

【问题讨论】:

  • 使用 Json.NET 并创建映射到数据的对象,然后反序列化为对象。
  • 任何示例请参考上面的json?

标签: c# json httpresponse json-deserialization


【解决方案1】:

使用Json-Net 反序列化响应。要生成类,您可以使用 this generator,它接受 Json 输入并输出关联的 C# 类。

    //....
    var responseObject = JsonConvert.DeserializeObject<RootObject>(responseText);
}

public class IosInfo
{
    public string serialNumber { get; set; }
    public string imeiNumber { get; set; }
    public string meid { get; set; }
    public string iccID { get; set; }
    public string firstUnbrickDate { get; set; }
    public string lastUnbrickDate { get; set; }
    public string unbricked { get; set; }
    public string unlocked { get; set; }
    public string productVersion { get; set; }
    public string initialActivationPolicyID { get; set; }
    public string initialActivationPolicyDetails { get; set; }
    public string appliedActivationPolicyID { get; set; }
    public string appliedActivationDetails { get; set; }
    public string nextTetherPolicyID { get; set; }
    public string nextTetherPolicyDetails { get; set; }
    public string macAddress { get; set; }
    public string bluetoothMacAddress { get; set; }
    public string partDescription { get; set; }
}

public class ConsumerLawInfo
{
    public string serviceType { get; set; }
    public string popMandatory { get; set; }
    public string allowedPartType { get; set; }
}

public class ProductInfo
{
    public string serialNumber { get; set; }
    public string warrantyStatus { get; set; }
    public string coverageEndDate { get; set; }
    public string coverageStartDate { get; set; }
    public string daysRemaining { get; set; }
    public string estimatedPurchaseDate { get; set; }
    public string purchaseCountry { get; set; }
    public string registrationDate { get; set; }
    public string imageURL { get; set; }
    public string explodedViewURL { get; set; }
    public string manualURL { get; set; }
    public string productDescription { get; set; }
    public string configDescription { get; set; }
    public string slaGroupDescription { get; set; }
    public string contractCoverageEndDate { get; set; }
    public string contractCoverageStartDate { get; set; }
    public string contractType { get; set; }
    public string laborCovered { get; set; }
    public string limitedWarranty { get; set; }
    public string partCovered { get; set; }
    public string notes { get; set; }
    public string acPlusFlag { get; set; }
    public ConsumerLawInfo consumerLawInfo { get; set; }
}

public class RootObject
{
    public IosInfo ios_info { get; set; }
    public ProductInfo product_info { get; set; }
}

【讨论】:

  • 另一种选择是迭代 JObject,例如在这个答案中:stackoverflow.com/questions/11132288/…
  • 是的,但它对性能不太友好并且更容易出错。我喜欢使用这种方法来测试 API,但我不会在生产代码中实现它。
  • 您也可以在模型中使用 [JsonProperty] 属性。这样您就可以正确命名属性,同时确保映射正确的值。
  • 嗨@Max 从 Json-Net 下载上述文件后。我在文件夹中有很多文件。我添加了对名为“Newtonsoft.Json.dll”的项目的引用,并添加了命名空间“使用 Newtonsoft.Json.Serialization;”但我在'Newton Json.JsonConverter does not contain definition for 'Deserialize' at line var responseObject = JsonConvert.Deserialize(responseText); :(请帮助..
  • 哦..!真的很棒@Max 现在它工作没有任何错误!真的真的谢谢..:) 你救了我的一天..!感谢您为这篇文章所做的努力:)
【解决方案2】:

您需要有一个包含 json 字符串包含的所有属性的类,例如,您有一个名为 Jsondeserial 的类

JsonDeserial obj = JsonConvert.DeserializeObject<JsonDeserial>(jsonstring);

这会将您的 json 字符串转换为该对象值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-12
    • 2013-03-11
    • 2013-05-05
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    相关资源
    最近更新 更多