brian4342
brian4342

Reputation: 1253

Get information from a json string?

I have received a json string and i need help mapping that to an object

currently i am using:

string request = webClient.DownloadString(url);

which returns a json string of invoices:

"{\"invoices\":[
{\"url\":\"https://api.freeagent.com/v2/invoices/0000001\",\"contact\":\"https://api.freeagent.com/v2/contacts/000001\",\"dated_on\":\"2010-10-29\",\"due_on\":\"2010-11-28\",\"reference\":\"0001\",\"currency\":\"GBP\",\"exchange_rate\":\"1.0\",\"net_value\":\"60.0\",\"sales_tax_value\":\"68.0\",\"total_value\":\"528.0\",\"paid_value\":\"528.0\",\"due_value\":\"0.0\",\"status\":\"Paid\",\"omit_header\":false,\"payment_terms_in_days\":30,\"paid_on\":\"2011-11-14\"},{\"url\":\"https://api.freeagent.com/v2/invoices/0000002\",\"contact\":\"https://api.freeagent.com/v2/contacts/000002\",\"dated_on\":\"2010-11-19\",\"due_on\":\"2010-12-19\",\"reference\":\"0002\",\"currency\":\"GBP\",\"exchange_rate\":\"1.0\",\"net_value\":\"80.0\",\"sales_tax_value\":\"6.5\",\"total_value\":\"326.5\",\"paid_value\":\"650.0\",\"due_value\":\"76.5\",\"status\":\"Overdue\",\"comments\":\"Work\",\"omit_header\":false,\"payment_terms_in_days\":30}]}"

I have an invoice class:

public class Invoices
    {
        public string url { get; set; }
        public string project { get; set; } //--
        public string contact { get; set; } //--
        public string dated_on { get; set; } //--
        public string due_on { get; set; } //--
        public string paid_on { get; set; }
        public string reference { get; set; } //--
        public string currency { get; set; } //--
        public string exchange_rate { get; set; } //--
        public string net_value { get; set; }
        public string sales_tax_value { get; set; }
        public string total_value { get; set; }
        public string paid_value { get; set; }
        public string due_value { get; set; }
        public string discount_percent { get; set; } 
        public string status { get; set; }
        public string comments { get; set; } //--
        public string omit_header { get; set; }
        public string payment_terms_in_days { get; set; } //--
        public string ec_status { get; set; } //need to add fields
        public string written_off_date { get; set; }
}

Different invoices can return different information which is why there is a lot of values in the class that may not be in the json string. I have tried these approaches but keep getting errors:

List<Invoices> list = JsonConvert.DeserializeObject<List<Invoices>>(request);

Dictionary<string, string> values = JsonConvert.DeserializeObject<Dictionary<string, string>>(request);

Could someone show me how to get the information shown in the string out?

Edit: I have also tried:

var info = JsonConvert.DeserializeObject(request);

And that return this as a jObect

{
  "invoices": [
    {
      "url": "https://api.freeagent.com/v2/invoices/000000",
      "contact": "https://api.freeagent.com/v2/contacts/000000",
      "dated_on": "2010-10-29",
      "due_on": "2010-11-28",
      "reference": "0000",
      "currency": "GBP",
      "exchange_rate": "1.0",
      "net_value": "960.0",
      "sales_tax_value": "568.0",
      "total_value": "528.0",
      "paid_value": "528.0",
      "due_value": "0.0",
      "status": "Paid",
      "omit_header": false,
      "payment_terms_in_days": 30,
      "paid_on": "2011-11-14"
    },
    {
      "url": "https://api.freeagent.com/v2/invoices/000000",
      "contact": "https://api.freeagent.com/v2/contacts/000000",
      "dated_on": "2010-11-19",
      "due_on": "2010-12-19",
      "reference": "0000",
      "currency": "GBP",
      "exchange_rate": "1.0",
      "net_value": "980.0",
      "sales_tax_value": "46.5",
      "total_value": "326.5",
      "paid_value": "650.0",
      "due_value": "76.5",
      "status": "Overdue",
      "comments": "Work",
      "omit_header": false,
      "payment_terms_in_days": 30
    }
}

Upvotes: 1

Views: 145

Answers (2)

Jim
Jim

Reputation: 2984

The classes (as for the Json u posted) should look like this:

public class Invoice
{
    public string url { get; set; }
    public string contact { get; set; }
    public string dated_on { get; set; }
    public string due_on { get; set; }
    public string reference { get; set; }
    public string currency { get; set; }
    public string exchange_rate { get; set; }
    public string net_value { get; set; }
    public string sales_tax_value { get; set; }
    public string total_value { get; set; }
    public string paid_value { get; set; }
    public string due_value { get; set; }
    public string status { get; set; }
    public bool omit_header { get; set; }
    public int payment_terms_in_days { get; set; }
    public string paid_on { get; set; }
    public string comments { get; set; }
}

public class RootObject
{
    public List<Invoice> invoices { get; set; }
}

And:

RootObject list = JsonConvert.DeserializeObject<RootObject>(request);

The RootObject object contains a list of invoices

Json: (there is a ] missing on your version, near the end of the Json to close the array)

{
"invoices": [
    {
      "url": "https://api.freeagent.com/v2/invoices/000000",
      "contact": "https://api.freeagent.com/v2/contacts/000000",
      "dated_on": "2010-10-29",
      "due_on": "2010-11-28",
      "reference": "0000",
      "currency": "GBP",
      "exchange_rate": "1.0",
      "net_value": "960.0",
      "sales_tax_value": "568.0",
      "total_value": "528.0",
      "paid_value": "528.0",
      "due_value": "0.0",
      "status": "Paid",
      "omit_header": false,
      "payment_terms_in_days": 30,
      "paid_on": "2011-11-14"
    },
    {
      "url": "https://api.freeagent.com/v2/invoices/000000",
      "contact": "https://api.freeagent.com/v2/contacts/000000",
      "dated_on": "2010-11-19",
      "due_on": "2010-12-19",
      "reference": "0000",
      "currency": "GBP",
      "exchange_rate": "1.0",
      "net_value": "980.0",
      "sales_tax_value": "46.5",
      "total_value": "326.5",
      "paid_value": "650.0",
      "due_value": "76.5",
      "status": "Overdue",
      "comments": "Work",
      "omit_header": false,
      "payment_terms_in_days": 30
    }]
}

Upvotes: 2

Royi Namir
Royi Namir

Reputation: 148514

Could someone show me how to get the information shown in the string out?

You can do this (dynamic):

   JavaScriptSerializer oSerializer = new JavaScriptSerializer();
   dynamic lst  = oSerializer.Deserialize<dynamic>(request );
   Console.WriteLine(lst["invoices"][0]["due_on"]); <--put here whatever you want.

Here for example , I read the value of the first item in array :

enter image description here

Upvotes: 1

Related Questions