【问题标题】:How to read specific Json object from Json string in C#?如何从 C# 中的 Json 字符串中读取特定的 Json 对象?
【发布时间】:2014-07-17 11:46:37
【问题描述】:

下面是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": ""
    }
}
}

以下读取Key:Value中的所有JSON并以表格格式显示但我只需要特定的对象,即json的FMI section仅字符串:

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”部分的所有内容。并以key:Value.表格格式显示

注意: 我正在使用 Framework 3.5 因此不能使用 dynamic 关键字。 有什么想法吗?

【问题讨论】:

    标签: c# json json-deserialization


    【解决方案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;
    }
    

    【讨论】:

    • 什么是“Dump()”这个词,它是 3.5 中的关键字吗?我没有得到你的代码!抛出错误! :(
    • @SHEKHARSHETE 哎呀,这是我在 LINQPad 中调试/开发的结果。它只是让我看到该方法调用的结果。你可以删除它。
    • 嘿@Tim S!你简直太棒了..! :) 有用!经过一定程度的修改:)非常感谢!
    【解决方案2】:

    由于您没有将其反序列化为“强类型”对象,因此您可以执行以下操作:

        var fmi = JsonConvert.DeserializeObject<Dictionary<string,object>>(str)["fmi"];
        var keys = JsonConvert.DeserializeObject<Dictionary<string, object>>(fmi.ToString());
    

    【讨论】:

    • 你试过这个吗?它在行给出错误:resDict [“fmi”].Keys。错误:对象不包含键的定义。 :(
    • 不是我需要的格式化方式!但您仍然值得 +1 并感谢您为我花费的时间! :)
    • 我将为 fmi 部分创建一个强类型对象并将内容反序列化到其中。以目前的方式使用 dynamics\dictionaries\jsons 很难。
    • 是的,我同意!我选择这种方法是因为 JSON 字符串内容可能会有所不同。首先,我使用了 JSON 到 C# 类转换器,但 JSON 无法编译,所以...:)
    【解决方案3】:

    这个方法可以准确解决,记住,你需要Newtonsoft.Json;

    //using Newtonsoft.Json;
    // using System.IO;
    
    string dataPath = @"myfile.json"; // Location of the json
    string jsonData = "";
    using (StreamReader r = new StreamReader(Path.Combine(dataPath)))
    {
        string json = r.ReadToEnd();
        jsonData = json;
    }
    dynamic obj = JsonConvert.DeserializeObject(jsonData);
    string value = obj["name"]; // here name is the object name holding the required data
    Console.WriteLine(value);
    Console.ReadLine();
    /*
    * OUTPUT
    * itzplayz
    */
    

    这是 JSON 示例

    {
      "name": "itzplayz"
    }
    

    现在您可以在名为 value 的字符串中获取 JSON 对象的值

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多