如何使用Newtonsoft获取复杂json文件c#/中的密钥

时间:2018-03-06 21:22:59

标签: c# json json.net

{
    "product": [
        {
            "_id": {
                "$oid": "5968dd23fc13ae04d9000001"
            },
            "product_name": "sildenafil citrate",
            "supplier": "Wisozk Inc",
            "quantity": 261,
            "unit_cost": "$10.47"
        },
        {
            "_id": {
                "$oid": "5968dd23fc13ae04d9000002"
            },
            "product_name": "Mountain Juniperus ashei",
            "supplier": "Keebler-Hilpert",
            "quantity": 292,
            "unit_cost": "$8.74"
        },
        {
            "_id": {
                "$oid": "5968dd23fc13ae04d9000003"
            },
            "product_name": "Dextromathorphan HBr",
            "supplier": "Schmitt-Weissnat",
            "quantity": 211,
            "unit_cost": "$20.53"
        }
    ]
}

如何使用Newtonsoft获取复杂json文件的密钥?

我不明白如何在json中获取密钥,而不是因为代码中的json很难: https://www.newtonsoft.com/json/help/html/JObjectProperties.htm

我用这个方法来读取我的json:

从json读取是可以的,但我仍然无法获得所有的键/属性  _id / PRODUCT_NAME /供应商/数量/ UNIT_COST

        using (StreamReader file = File.OpenText(@"products.json"))
        using (JsonTextReader reader = new JsonTextReader(file))
        {
            JObject o2 = (JObject)JToken.ReadFrom(reader);
            //WriteLine(o2.GetValue("product"));

            foreach (KeyValuePair<string, JToken> property in o2)
            {
                WriteLine(property.Value[0]);
            }
        }

完成的:

            "_id": {
                "$oid": "5968dd23fc13ae04d9000001"
            },
            "product_name": "sildenafil citrate",
            "supplier": "Wisozk Inc",
            "quantity": 261,
            "unit_cost": "$10.47"
        },

但我想只获得字段名称: _ID 产品名称 供应商 数量 UNIT_COST

我希望这样的东西:但它似乎不适用于我的代码: https://www.codeproject.com/Tips/1175341/Extract-Json-Fields

谢谢,

1 个答案:

答案 0 :(得分:2)

<强>更新

OP提供的link,密钥列表可以像以下一样获取:

using (StreamReader r = new StreamReader("Json_1.json"))
{
    string json = r.ReadToEnd();        
    var obj = JObject.Parse(json);
    foreach (var o in obj)
    {
        var result = GetFieldNames(o.Value.ToString());
    }
}

GetFieldNames()

public static List<string> GetFieldNames(dynamic input)
{
    List<string> fieldNames = new List<string>();

    try
    {
        // Deserialize the input json string to an object
        input = Newtonsoft.Json.JsonConvert.DeserializeObject(input);

        // Json Object could either contain an array or an object or just values
        // For the field names, navigate to the root or the first element
        input = input.Root ?? input.First ?? input;

        if (input != null)
        {
            // Get to the first element in the array
            bool isArray = true;
            while (isArray)
            {
                input = input.First ?? input;

                if (input.GetType() == typeof(Newtonsoft.Json.Linq.JObject) || 
                input.GetType() == typeof(Newtonsoft.Json.Linq.JValue) || 
                input == null)
                    isArray = false;
            }

            // check if the object is of type JObject. 
            // If yes, read the properties of that JObject
            if (input.GetType() == typeof(Newtonsoft.Json.Linq.JObject))
            {
                // Create JObject from object
                Newtonsoft.Json.Linq.JObject inputJson = 
                    Newtonsoft.Json.Linq.JObject.FromObject(input);

                // Read Properties
                var properties = inputJson.Properties();

                // Loop through all the properties of that JObject
                foreach (var property in properties)
                {
                    // Check if there are any sub-fields (nested)
                    // i.e. the value of any field is another JObject or another JArray
                    if (property.Value.GetType() == typeof(Newtonsoft.Json.Linq.JObject) || 
                    property.Value.GetType() == typeof(Newtonsoft.Json.Linq.JArray))
                    {
                        // If yes, enter the recursive loop to extract sub-field names
                        var subFields = GetFieldNames(property.Value.ToString());

                        if (subFields != null && subFields.Count() > 0)
                        {
                            // join sub-field names with field name 
                            //(e.g. Field1.SubField1, Field1.SubField2, etc.)
                            fieldNames.AddRange(
                                subFields
                                .Select(n =>
                                string.IsNullOrEmpty(n) ? property.Name :
                             string.Format("{0}.{1}", property.Name, n)));
                        }
                    }
                    else
                    {
                        // If there are no sub-fields, the property name is the field name
                        fieldNames.Add(property.Name);
                    }
                }
            }
            else
                if (input.GetType() == typeof(Newtonsoft.Json.Linq.JValue))
            {
                // for direct values, there is no field name
                fieldNames.Add(string.Empty);
            }
        }
    }
    catch
    {
        throw;
    }

    return fieldNames;
}

enter image description here