使用数组读取JSON文件

时间:2018-10-24 05:36:28

标签: c# json

我目前正在使用C#进行JSON字符串提取。我的JSON字符串由具有重复键的数组组成。由于我是新手,所以不确定我是否在正确地描述它。

这是我的JSON字符串

maps

我需要提取数组内部的invItemID键的值。 我试图从一个类序列化我的json字符串,但它在List <>

中返回null

这是我的代码

{"Index":
{   "LibraryName":"JGKing"
    ,   "FormName":"AccountsPayable"
    ,   "User":null
    ,   "FilingPriority":null
    ,   "FileDescription":null
    ,   "Fields":
            {"Field":
                [
                    {       "Name":"invItemID"
                        ,   "Value":"6276"
                    }
                    ,{      "Name":"invEntityCode"
                    ,       "Value":"16"
                    }

                    ,{      "Name":"invVendorCode"
                    ,       "Value":"MIRUB01"
                    }

                    ,{      "Name":"invNumber"
                    ,       "Value":"PWD5"
                    }

                    ,{      "Name":"invDate"
                    ,       "Value":"2017-08-21"
                    }

                    ,{      "Name":"invStatus"
                    ,       "Value":""
                    }

                    ,{      "Name":"invCurrencyCode"
                    ,       "Value":"AU"
                    }

                    ,{      "Name":"invCurrencyRate"
                    ,       "Value":"1"
                    }

                    ,{      "Name":"invTax"
                    ,       "Value":"454.3"
                    }

                    ,       {"Name":"invTotal"
                    ,       "Value":"4997.27"
                    }

                    ,       {"Name":"invReceivedDate"
                    ,       "Value":"2017-09-06"
                    }

                    ,{      "Name":"InvoiceLine1"
                    ,       "Value":"{\r\n  \"invLineNumber\": \"1\",\r\n  \"invPONumber\": \"\",\r\n  \"invPOLineNo\": \"1\",\r\n  \"invPOJobID\": \"\",\r\n  \"invCostCode\": \"\",\r\n  \"invCategory\": \"\",\r\n  \"invGLCode\": \"61-01-49-6862.517\",\r\n  \"invDescription\": \"\",\r\n  \"invEntryType\": \"\",\r\n  \"invAmount\": \"4542.97\",\r\n  \"invTaxAmount\": \"454.3\",\r\n  \"invTaxCode\": \"GST\",\r\n  \"invAmountIncTax\": \"4997.27\"\r\n}"}]}}}

希望你能帮助我。

预先感谢

2 个答案:

答案 0 :(得分:2)

尝试使用您的类来反映JSON文件:

public class Index
{
    public string LibraryName { get; set; }
    public string FormName { get; set; }
    public string User { get; set; }
    public string FilingPriority { get; set; }
    public string FileDescription { get; set; }
    public Fields Fields { get; set; } //this line makes the difference
}

如果现在反序列化,则应自动填充字段。我还建议您使用JsonConvert.Deserialze<>(),因为它更容易使用(请参阅documentation),并且您是本主题的新手。

获取invItemID的值可能像这样:

public void CFExport(string jsonFile)
{
    string ItemIDField = "invItemID";
    string ItemIDValue;

    using (StreamReader r = new StreamReader(jsonFile))
    {
        var Idx = JsonConvert.DeserializeObject<JSONMain>(r);

        foreach(var field in Idx.Index.Fields.Field) 
        {
            if(field.Name == ItemIDField)
            {
                ItemIDValue = field.Value;
            }
        }
    }
}

W。我对Stackoverflow的第一个答案!希望对您有帮助。

答案 1 :(得分:0)

  

我需要提取数组内部的invItemID键的值。

您可以使用invItemIDField数组中检索指定键JObject的值。

因此,您不再需要为json管理类。

在这里,我创建了一个控制台应用程序用于演示。

class Program
{
    static void Main(string[] args)
    {
        //Get your json from file
        string json = File.ReadAllText(@"Your path to json file");

        //Parse your json
        JObject jObject = JObject.Parse(json);

        //Get your "Field" array to List of NameValuePair
        var fieldArray = jObject["Index"]["Fields"]["Field"].ToObject<List<NameValuePair>>();

        //Retrieve Value for key "invItemID"
        string value = fieldArray.Where(x => x.Name == "invItemID").Select(x => x.Value).FirstOrDefault();

        //Print this value on console
        Console.WriteLine("Value: " + value);

        Console.ReadLine();
    }

}

class NameValuePair
{
    public string Name { get; set; }
    public string Value { get; set; }
}

输出:

enter image description here