Owen
Owen

Reputation: 21

Reading JSON file with Array

I'm currently working on JSON string extraction using C#. My JSON string consist of an array with repetitive keys. Not sure if I'm describing it right since I'm new to this.

This is my JSON string

{"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}"}]}}}

I need to extract the value of invItemID key which is inside the array. I tried to serialize my json string from a class but it returns null in the List<>

Here's my code

    public void CFExport(string jsonFile)
    {
        string ItemIDField;
        string ItemIDValue;

            using (StreamReader r = new StreamReader(jsonFile))
            {
                JsonSerializer s = new JsonSerializer();
                var Idx = (JSONMain)s.Deserialize(r, typeof(JSONMain));
                var flds = (Fields)s.Deserialize(r, typeof(Fields));

                if (flds != null)
                {
                    foreach (var _field in flds.Field)
                    {
                        ItemIDField = _field.Name;
                        ItemIDValue = _field.Value;
                    }
                }
            }
    }


public class JSONMain
{
    public Index Index { get; set; }
}

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 class Fields
{
    public List<Field> Field { get; set; }
}

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

}

I hope you can help me.

Thanks in advance

Upvotes: 2

Views: 79

Answers (2)

er-sho
er-sho

Reputation: 9771

I need to extract the value of invItemID key which is inside the array.

You can retrieve value for your specified key invItemID from Field array by using JObject.

So you have no more need to manage classes for your json.

Here i created a console app for your demonstration purpose.

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; }
}

Output:

enter image description here

Upvotes: 0

Valinor
Valinor

Reputation: 21

Try to reflect the JSON file with your classes like this:

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
}

If you deserialize now, the fields should be populated automatically. I also advice you to use JsonConvert.Deserialze<>() since it is a bit easier (see documentation) and you are new to this topic.

Getting the value of invItemID could look like this:

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;
            }
        }
    }
}

Whoohoo. My first answer on Stackoverflow! I hope this helps you.

Upvotes: 2

Related Questions