Как прочитать конкретный объект Json из строки Json в C #?

1

Ниже приведена строка JSON:

{
"ios_info": {
    "serialNumber": "F2LLMBNJFFF",
    "imeiNumber": "01388400413235",
    "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": "F2LLMBNJFFFQ",
            "imei": "013884004132355",
            "isLocked": "true",
            "isLost": "false"
        }
    }
},
"product_info": {
    "serialNumber": "F2LLMBNJFFFQ",
    "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 в Key:Value и отображение в формате таблицы. Но мне нужен только конкретный объект, т. Е. Раздел FMI только для json-строки:

private string GetKeyValuePairs(string jsonString)
    {
        var resDict = JsonConvert.DeserializeObject<Dictionary<string, object>>(jsonString);
        string sdict = string.Empty;
        string fmitxt = string.Empty;
        string fmitxt2 = string.Empty;
        foreach (string key in resDict.Keys)
        {
          sdict += "<tr><td> " + key + "</td> " + (resDict[key].GetType() == typeof(Newtonsoft.Json.Linq.JObject) ? "<td>" + GetKeyValuePairs(resDict[key].ToString()) + "</td></tr>" : "<td>" + resDict[key].ToString() + "</td></tr>");

        }
        return sdict;
    }

Проблема:

Я хочу прочитать ВСЕ содержание раздела "fmi". и отобразить в ключе: Значение. формат таблицы

ПРИМЕЧАНИЕ. Я использую Framework 3.5, поэтому не могу использовать dynamic ключевое слово. Есть идеи?

Теги:
json-deserialization

2 ответа

1
Лучший ответ

Я бы рекомендовал вам работать с ним как с JObject напрямую; это класс, который вы использовали бы за кадром, если бы вы использовали dynamic. Кроме того, вам нужно отделить выбор fmi от нормального пути, выполняемого в рекурсивных вызовах: здесь у меня это в Main.

void Main()
{
    var resObj = JsonConvert.DeserializeObject<JObject>(jsonString);
    var result = GetKeyValuePairs((JObject)resObj["fmi"]);
}
private string GetKeyValuePairs(JObject resObj)
{
    string sDict = string.Empty;
    string fmitxt = string.Empty;
    string fmitxt2 = string.Empty;
    foreach (var pair in resObj)
    {
      sDict += "<tr><td> " + pair.Key + "</td>";
      if (pair.Value is JObject)
        sDict += "<td>" + GetKeyValuePairs((JObject)pair.Value) + "</td></tr>";
      else
        sDict += "<td>" + pair.Value.ToString() + "</td></tr>";
    }
    return sDict;
}
  • 0
    Что такое слово "Dump ()", это ключевое слово в 3.5? Я не получаю ваш код! Выдает ошибку! :(
  • 0
    @SHEKHARSHETE Ой, это была вещь из моей отладки / разработки в LINQPad. Это просто позволило мне увидеть результаты этого вызова метода. Вы можете удалить это.
Показать ещё 1 комментарий
1

Поскольку вы не десериализируете это в "сильный типизированный" объект, вы можете сделать что-то вроде этого:

    var fmi = JsonConvert.DeserializeObject<Dictionary<string,object>>(str)["fmi"];
    var keys = JsonConvert.DeserializeObject<Dictionary<string, object>>(fmi.ToString());
  • 0
    ты пробовал это? выдает ошибку в строке: resDict ["fmi"]. Ключи. Ошибка: объект не содержит определения для ключей. :(
  • 0
    Я отредактировал ...
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню