Как прочитать динамическую возвращенную строку JSON в C#?
У меня есть Apple API
который возвращает Apple
Информация об устройстве с использованием SerialNumber/IMEI
номер и возвращает JSON
строка.
И успешно создали классы, используя конвертер классов JSON в C#, и он отлично работает. Но проблема в том, когда я звоню Out of Warranty
[устройство, которое прошло гарантию, возвращает другой JSON] устройство, которое возвращает JSON с другим Key, Значения, следовательно, приведение RootObject не выполняется.
JSON 1: [для гарантийного устройства]
{
"ios_info": {
"serialNumber": "F2LLMBNJF",
"imeiNumber": "013884004132",
"meid": "",
"iccID": "8901410427640096045",
"firstUnbrickDate": "11/27/13",
"lastUnbrickDate": "11/27/13",
"unbricked": "true",
"unlocked": "false",
"productVersion": "7.1.2",
"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": "ACFDEC6C988A",
"bluetoothMacAddress": "AC:FD:EC:6C:98:8B",
"partDescription": "IPHONE 5S SPACE GRAY 64GB-USA"
},
"fmi": {
"@attributes": {
"version": "1",
"deviceCount": "1"
},
"fmipLockStatusDevice": {
"@attributes": {
"serial": "F2LLMBNJF",
"imei": "013884004132",
"isLocked": "true",
"isLost": "false"
}
}
},
"product_info": {
"serialNumber": "F2LLMBNJF",
"warrantyStatus": "Apple Limited Warranty",
"coverageEndDate": "11/25/14",
"coverageStartDate": "11/26/13",
"daysRemaining": "498",
"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 2: [для негарантийного устройства]
{
"ios_info": "Provided serial number does not belong to an iOS Device.Please Enter an ios serial number.",
"product_info": {
"serialNumber": "C02HW2LGD",
"warrantyStatus": "Out Of Warranty (No Coverage)",
"daysRemaining": "0",
"estimatedPurchaseDate": "07/20/12",
"purchaseCountry": "United States",
"registrationDate": "",
"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": "MacBook Pro (Retina, Mid 2012)",
"configDescription": "MBP 15.4/2.3/8GB/256GB FLASH",
"slaGroupDescription": "",
"acPlusFlag": "",
"consumerLawInfo": {
"serviceType": "",
"popMandatory": "",
"allowedPartType": ""
}
}
}
Исходный код:
public class AppleAPI
{
public IosInfo ios_info { get; set; }
public ProductInfo product_info { get; set; }
public bool error { get; set; }
public string error_message { get; set; }
public AppleAPI()
{
//
// TODO: Add constructor logic here
//
}
public string VerifyAppleESN(string esn)
{
string responseText = string.Empty;
//Apple API code here
return 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; }
}
Десериализация JSON:
string responseText = string.Empty;
AppleAPI appobj = new AppleAPI();
responseText = appobj.VerifyAppleESN(newEsn);
//Below line works only wen Device is in Warranty & if Out of Warranty it gives error.
var resobj = JsonConvert.DeserializeObject<AppleAPI>(responseText);
Итак, я хочу знать , можем ли мы прочитать возвращенную динамическую строку JSON и отобразить в HTML-таблице, не зная ее ключа и количества элементов.
ПРИМЕЧАНИЕ. Я использую .NET Framework 3.5, поэтому не могу использовать dynamic
ключевое слово, как много образцов доступны с использованием версии 4.0
Обновить:
var resDict = JsonConvert.DeserializeObject<Dictionary<string, object>>(responseText);
string sdict = string.Empty;
string innertval = string.Empty;
foreach (string key in resDict.Keys)
{
sdict += "<br/> " +key+" "+ resDict[key].ToString();
}
Попробовав предложенный код из @tt_emrah и изменив его в определенной степени, я получил следующую строку:
ios_info Provided serial number does not belong to an iOS Device.Please Enter an ios serial number.
product_info { "serialNumber": "C02HW2LGDKQ", "warrantyStatus": "Out Of Warranty (No Coverage)", "daysRemaining": "0", "estimatedPurchaseDate": "07/20/12", "purchaseCountry": "United States", "registrationDate": "", "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": "MacBook Pro (Retina, Mid 2012)", "configDescription": "MBP 15.4/2.3/8GB/256GB FLASH", "slaGroupDescription": "", "acPlusFlag": "", "consumerLawInfo": { "serviceType": "", "popMandatory": "", "allowedPartType": "" } }
Но как получить значения в формате Key:Value.
ПРИМЕЧАНИЕ: возвращенный JSON
Строка может измениться. так что не зависит от возвращенного JSON
строка просто хочет отобразить ее как ключ: значения
Пример:
serialNumber:C02HW2LGDKQ
warrantyStatus:Out of Warranty(No Coverage)
.
(n) key:values
Помощь приветствуется!
1 ответ
Почему бы не десериализовать строку в словарь, а затем перебрать ее ключи для части дисплея?
private string GetKeyValuePairs(string jsonString)
{
var resDict = JsonConvert.DeserializeObject<Dictionary<string, object>>(jsonString);
string sdict = string.Empty;
foreach (string key in resDict.Keys)
{
sdict += "<br/> " + key + " : " + (resDict[key].GetType() == typeof(JObject) ? GetKeyValuePairs(resDict[key].ToString()) : resDict[key].ToString());
}
return sdict;
}