i am having issue to get information from json response, i was trying to get information for label and value only from details object of json response, however i am unable to get those information because while converting json to c# classes from http://json2csharp.com/ gives different classes for 'General', 'AC Adapter' etc.. however in my case it will not work because the response having dynamic classes and therefore i cannot create classes.
{
"data": {
"General": {
"label": "General",
"details": [
{
"label": "Operating System",
"value": "Google Chrome OS"
},
{
"label": "Product Type",
"value": "Chromebook"
}
]
},
"AC Adapter": {
"label": "AC Adapter",
"details": [
{
"label": "Input",
"value": "AC 120/230 V ( 50/60 Hz )"
},
{
"label": "Output",
"value": "45 Watt , 20 V , 2.25 A"
}
]
},
"Audio & Video": {
"label": "Audio & Video",
"details": [
{
"label": "Camera",
"value": "Yes - 720p"
},
{
"label": "Graphics Processor",
"value": "Intel HD Graphics"
},
{
"label": "Resolution",
"value": "1 Megapixel"
},
{
"label": "Sound",
"value": "Stereo speakers , microphone"
}
]
},
"Battery": {
"label": "Battery",
"details": [
{
"label": "Capacity",
"value": "45 Wh"
},
{
"label": "Run Time",
"value": "Up to 10 hours"
},
{
"label": "Technology",
"value": "3-cell lithium ion"
}
]
},
"Communications": {
"label": "Communications",
"details": [
{
"label": "Features",
"value": "Dual stream (2x2)"
},
{
"label": "Wireless",
"value": "Bluetooth 4.0, 802.11a/b/g/n/ac"
},
{
"label": "Wireless Controller",
"value": "Intel Dual Band Wireless-AC 7260 - M.2 Card"
}
]
},
"Connections & Expansion": {
"label": "Connections & Expansion",
"details": [
{
"label": "Interfaces",
"value": "USB 3.0 � 2 x USB 2.0 � HDMI � Headphone/microphone combo jack"
},
{
"label": "Memory Card Reader",
"value": "Yes ( microSD )"
}
]
},
"Dimensions & Weight": {
"label": "Dimensions & Weight",
"details": [
{
"label": "Dimensions (WxDxH)",
"value": "11.8 in x 8.5 in x 0.9 in"
},
{
"label": "Weight",
"value": "2.84 lbs"
}
]
},
"Display": {
"label": "Display",
"details": [
{
"label": "Features",
"value": "Anti-glare"
},
{
"label": "Image Aspect Ratio",
"value": "16:9"
},
{
"label": "LCD Backlight Technology",
"value": "LED backlight"
},
{
"label": "Resolution",
"value": "1366 x 768 ( HD )"
},
{
"label": "Type",
"value": "11.6\""
},
{
"label": "Widescreen",
"value": "Yes"
}
]
},
"Input": {
"label": "Input",
"details": [
{
"label": "Features",
"value": "Spill-resistant"
},
{
"label": "Type",
"value": "Keyboard, touchpad"
}
]
},
"Manufacturer Warranty": {
"label": "Manufacturer Warranty",
"details": [
{
"label": "Service & Support",
"value": "Limited warranty - 1 year - carry-in"
}
]
},
"Memory": {
"label": "Memory",
"details": [
{
"label": "Max RAM Supported",
"value": "8 GB"
},
{
"label": "RAM",
"value": "4 GB ( provided memory is soldered )"
},
{
"label": "Speed",
"value": "1600 MHz"
},
{
"label": "Technology",
"value": "DDR3L SDRAM"
}
]
},
"Miscellaneous": {
"label": "Miscellaneous",
"details": [
{
"label": "Features",
"value": "Security lock slot (cable lock sold separately), administrator password, hard drive password, power-on password"
},
{
"label": "Included Accessories",
"value": "Power adapter"
},
{
"label": "Localization",
"value": "English"
},
{
"label": "Manufacturer Selling Program",
"value": "TopSeller"
}
]
},
"Processor / Chipset": {
"label": "Processor / Chipset",
"details": [
{
"label": "64-bit Computing",
"value": "Yes"
},
{
"label": "CPU",
"value": "Intel Celeron N3050 / 1.6 GHz"
},
{
"label": "Cache",
"value": "2 MB"
},
{
"label": "Features",
"value": "Integrated memory controller"
},
{
"label": "Max Turbo Speed",
"value": "2.16 GHz"
},
{
"label": "Number of Cores",
"value": "Dual-Core"
}
]
},
"Storage": {
"label": "Storage",
"details": [
{
"label": "Main Storage",
"value": "16 GB SSD - ( eMMC )"
}
]
}
}
}
http://json2csharp.com/ gives different classes for 'General', 'AC Adapter' etc
This works better: https://quicktype.io/?l=cs&r=json2csharp
However, I think your data is actually a dictionary here. So the final contract:
public class Response
{
[JsonProperty("data")]
public Data Data { get; set; }
}
public class Data : Dictionary<string, Item> { }
public class Item
{
[JsonProperty("details")]
public Detail[] Details { get; set; }
[JsonProperty("label")]
public string Label { get; set; }
}
public class Detail
{
[JsonProperty("label")]
public string Label { get; set; }
[JsonProperty("value")]
public string Value { get; set; }
}
And if you use Newtonsoft, deserialization:
var response = JsonConvert.DeserializeObject<Response>(jsonString);
if you just want to convert a json string to C# dynamic object, look at this SO question. The code is in the final version.
Related
I am looking for a script to find the value of $6383.12 for Accounts Receivable (A/R) in this code. There are several values I want to be able to find but I can't seem to figure out how to structure my code to find the values I need.
I have spent time looking through and testing various versions of arrays, ILIst<> and other suggestions but I can't seem to get the final result I am looking for. I can find a single value (for example "Savings") but I don't know how to get the $800 value.
The script I am using is:
var root = JToken.Parse(data);
IList<JToken> t = root.SelectTokens("$...ColData[?(#.value == 'Accounts Receivable (A/R)')]").ToList();
foreach (var item in t)
{
Response.Write(item.ToString() + "<br/><br/>");
}
This gives me the Accounts Receivable (A/R) value but not the dollar value associated with it.
Here is the JSON result I am trying to parse through:
{
"Header": {
"ReportName": "BalanceSheet",
"Option": [
{
"Name": "AccountingStandard",
"Value": "GAAP"
},
{
"Name": "NoReportData",
"Value": "false"
}
],
"DateMacro": "this calendar year-to-date",
"ReportBasis": "Accrual",
"StartPeriod": "2016-01-01",
"Currency": "USD",
"EndPeriod": "2016-10-31",
"Time": "2016-10-31T09:42:21-07:00",
"SummarizeColumnsBy": "Total"
},
"Rows": {
"Row": [
{
"Header": {
"ColData": [
{
"value": "ASSETS"
},
{
"value": ""
}
]
},
"Rows": {
"Row": [
{
"Header": {
"ColData": [
{
"value": "Current Assets"
},
{
"value": ""
}
]
},
"Rows": {
"Row": [
{
"Header": {
"ColData": [
{
"value": "Bank Accounts"
},
{
"value": ""
}
]
},
"Rows": {
"Row": [
{
"ColData": [
{
"id": "35",
"value": "Checking"
},
{
"value": "1350.55"
}
],
"type": "Data"
},
{
"ColData": [
{
"id": "36",
"value": "Savings"
},
{
"value": "800.00"
}
],
"type": "Data"
}
]
},
"type": "Section",
"group": "BankAccounts",
"Summary": {
"ColData": [
{
"value": "Total Bank Accounts"
},
{
"value": "2150.55"
}
]
}
},
{
"Header": {
"ColData": [
{
"value": "Accounts Receivable"
},
{
"value": ""
}
]
},
"Rows": {
"Row": [
{
"ColData": [
{
"id": "84",
"value": "Accounts Receivable (A/R)"
},
{
"value": "6383.12"
}
],
"type": "Data"
}
]
},
"type": "Section",
"group": "AR",
"Summary": {
"ColData": [
{
"value": "Total Accounts Receivable"
},
{
"value": "6383.12"
}
]
}
},
{
"Header": {
"ColData": [
{
"value": "Other current assets"
},
{
"value": ""
}
]
},
"Rows": {
"Row": [
{
"ColData": [
{
"id": "81",
"value": "Inventory Asset"
},
{
"value": "596.25"
}
],
"type": "Data"
},
{
"ColData": [
{
"id": "4",
"value": "Undeposited Funds"
},
{
"value": "2117.52"
}
],
"type": "Data"
}
]
},
"type": "Section",
"group": "OtherCurrentAssets",
"Summary": {
"ColData": [
{
"value": "Total Other current assets"
},
{
"value": "2713.77"
}
]
}
}
]
},
"type": "Section",
"group": "CurrentAssets",
"Summary": {
"ColData": [
{
"value": "Total Current Assets"
},
{
"value": "11247.44"
}
]
}
},
{
"Header": {
"ColData": [
{
"value": "Fixed Assets"
},
{
"value": ""
}
]
},
"Rows": {
"Row": [
{
"Header": {
"ColData": [
{
"id": "37",
"value": "Truck"
},
{
"value": ""
}
]
},
"Rows": {
"Row": [
{
"ColData": [
{
"id": "38",
"value": "Original Cost"
},
{
"value": "13495.00"
}
],
"type": "Data"
}
]
},
"type": "Section",
"Summary": {
"ColData": [
{
"value": "Total Truck"
},
{
"value": "13495.00"
}
]
}
}
]
},
"type": "Section",
"group": "FixedAssets",
"Summary": {
"ColData": [
{
"value": "Total Fixed Assets"
},
{
"value": "13495.00"
}
]
}
}
]
},
"type": "Section",
"group": "TotalAssets",
"Summary": {
"ColData": [
{
"value": "TOTAL ASSETS"
},
{
"value": "24742.44"
}
]
}
},
{
"Header": {
"ColData": [
{
"value": "LIABILITIES AND EQUITY"
},
{
"value": ""
}
]
},
"Rows": {
"Row": [
{
"Header": {
"ColData": [
{
"value": "Liabilities"
},
{
"value": ""
}
]
},
"Rows": {
"Row": [
{
"Header": {
"ColData": [
{
"value": "Current Liabilities"
},
{
"value": ""
}
]
},
"Rows": {
"Row": [
{
"Header": {
"ColData": [
{
"value": "Accounts Payable"
},
{
"value": ""
}
]
},
"Rows": {
"Row": [
{
"ColData": [
{
"id": "33",
"value": "Accounts Payable (A/P)"
},
{
"value": "1984.17"
}
],
"type": "Data"
}
]
},
"type": "Section",
"group": "AP",
"Summary": {
"ColData": [
{
"value": "Total Accounts Payable"
},
{
"value": "1984.17"
}
]
}
},
{
"Header": {
"ColData": [
{
"value": "Credit Cards"
},
{
"value": ""
}
]
},
"Rows": {
"Row": [
{
"ColData": [
{
"id": "41",
"value": "Mastercard"
},
{
"value": "157.72"
}
],
"type": "Data"
}
]
},
"type": "Section",
"group": "CreditCards",
"Summary": {
"ColData": [
{
"value": "Total Credit Cards"
},
{
"value": "157.72"
}
]
}
},
{
"Header": {
"ColData": [
{
"value": "Other Current Liabilities"
},
{
"value": ""
}
]
},
"Rows": {
"Row": [
{
"ColData": [
{
"id": "89",
"value": "Arizona Dept. of Revenue Payable"
},
{
"value": "4.55"
}
],
"type": "Data"
},
{
"ColData": [
{
"id": "90",
"value": "Board of Equalization Payable"
},
{
"value": "401.98"
}
],
"type": "Data"
},
{
"ColData": [
{
"id": "43",
"value": "Loan Payable"
},
{
"value": "4000.00"
}
],
"type": "Data"
}
]
},
"type": "Section",
"group": "OtherCurrentLiabilities",
"Summary": {
"ColData": [
{
"value": "Total Other Current Liabilities"
},
{
"value": "4406.53"
}
]
}
}
]
},
"type": "Section",
"group": "CurrentLiabilities",
"Summary": {
"ColData": [
{
"value": "Total Current Liabilities"
},
{
"value": "6548.42"
}
]
}
},
{
"Header": {
"ColData": [
{
"value": "Long-Term Liabilities"
},
{
"value": ""
}
]
},
"Rows": {
"Row": [
{
"ColData": [
{
"id": "44",
"value": "Notes Payable"
},
{
"value": "25000.00"
}
],
"type": "Data"
}
]
},
"type": "Section",
"group": "LongTermLiabilities",
"Summary": {
"ColData": [
{
"value": "Total Long-Term Liabilities"
},
{
"value": "25000.00"
}
]
}
}
]
},
"type": "Section",
"group": "Liabilities",
"Summary": {
"ColData": [
{
"value": "Total Liabilities"
},
{
"value": "31548.42"
}
]
}
},
{
"Header": {
"ColData": [
{
"value": "Equity"
},
{
"value": ""
}
]
},
"Rows": {
"Row": [
{
"ColData": [
{
"id": "34",
"value": "Opening Balance Equity"
},
{
"value": "-9337.50"
}
],
"type": "Data"
},
{
"ColData": [
{
"id": "2",
"value": "Retained Earnings"
},
{
"value": "91.25"
}
],
"type": "Data"
},
{
"ColData": [
{
"value": "Net Income"
},
{
"value": "2440.27"
}
],
"type": "Data",
"group": "NetIncome"
}
]
},
"type": "Section",
"group": "Equity",
"Summary": {
"ColData": [
{
"value": "Total Equity"
},
{
"value": "-6805.98"
}
]
}
}
]
},
"type": "Section",
"group": "TotalLiabilitiesAndEquity",
"Summary": {
"ColData": [
{
"value": "TOTAL LIABILITIES AND EQUITY"
},
{
"value": "24742.44"
}
]
}
}
]
},
"Columns": {
"Column": [
{
"ColType": "Account",
"ColTitle": "",
"MetaData": [
{
"Name": "ColKey",
"Value": "account"
}
]
},
{
"ColType": "Money",
"ColTitle": "Total",
"MetaData": [
{
"Name": "ColKey",
"Value": "total"
}
]
}
]
}
}
You can try this,
var json = File.ReadAllText("json1.json");
var jToken = JToken.Parse(json);
var reader = jToken.CreateReader();
while (reader.Read())
{
var value = reader.Value;
if (value != null && value.ToString() == "Accounts Receivable (A/R)")
{
var test = jToken.SelectToken(reader.Path.Replace("[0].value", "[1].value"));
}
}
If it's not doable to write json path which selects proper tokens you could try using Parent property and Children method.
foreach (var item in t)
{
var valueToken = item.Parent.Children().ElementAt(1);
Response.Write(valueToken.ToString() + "<br/><br/>");
}
I want to get the FILE-file-id, FILE-fileSize FILENAME-id, INCIDENT-reportedOn out of the following JObject:
Note the two "[[" at the beginning. Do I have to reduce the JObject first?
[
[{
"FILENAME": {
"id": "renamedtopdf.docx.pdf",
"label": "fileName",
"type": "vertex"
},
"FILE": {
"id": "dc92d48b7e29c528b3eb168446e51736101122a821c9e712320bd6842116719a",
"label": "file",
"type": "vertex",
"properties": {
"fileSize": [{
"id": "f9339436-189a-4503-abc6-e2989be6f138",
"value": "164198"
}],
"mimeType": [{
"id": "0a89dbfa-c204-45c8-8524-3fbd02b04e39",
"value": "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"
}]
}
},
"INCIDENT": {
"id": "16ea8c8b-65ee-44b3-afbb-98308b092b4f",
"label": "incident",
"type": "vertex",
"properties": {
"reportedOn": [{
"id": "81485296-a62f-4d17-a03f-4995c3cad937",
"value": "2/16/2019 10:33:59 AM"
}]
}
}
},
I'll assume you already extracted the JObject from the two arrays. I that case you can simply use the index operator to traverse the json file like so:
json["FILE"]["id"].Value<string>();
json["FILE"]["properties"]["fileSize"]["value"].Value<string>();
json["FILENAME"]["id"].Value<string>();
json["INCIDENT"]["properties"]["reportedOn"]["Value"].Value<string>();
Full Example:
const string text = #"{
"FILENAME": {
"id": "renamedtopdf.docx.pdf",
"label": "fileName",
"type": "vertex"
},
"FILE": {
"id": "dc92d48b7e29c528b3eb168446e51736101122a821c9e712320bd6842116719a",
"label": "file",
"type": "vertex",
"properties": {
"fileSize": [
{
"id": "f9339436-189a-4503-abc6-e2989be6f138",
"value": "164198"
}
],
"mimeType": [
{
"id": "0a89dbfa-c204-45c8-8524-3fbd02b04e39",
"value": "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"
}
]
}
},
"INCIDENT": {
"id": "16ea8c8b-65ee-44b3-afbb-98308b092b4f",
"label": "incident",
"type": "vertex",
"properties": {
"reportedOn": [
{
"id": "81485296-a62f-4d17-a03f-4995c3cad937",
"value": "2/16/2019 10:33:59 AM"
}
]
}
}
}";
var json = JObject.Parse(text);
json["FILE"]["id"].Value<string>();
json["FILE"]["properties"]["fileSize"]["value"].Value<string>();
json["FILENAME"]["id"].Value<string>();
json["INCIDENT"]["properties"]["reportedOn"]["Value"].Value<string>();
I am using Json.Net, where I am getting the following result of an object in C#.
{"library": [
{
"key": "OUTFRMT",
"description": "Level 1 description",
"label": "Label 1",
"value": "Value 1",
"id": 1
},
{
"key": "OUTFRMT",
"description": "Level 2 description",
"label": "Label 2",
"value": "Value 2",
"id": 2
},
{
"key": "RQSTYPEFRMT",
"description": "Level 2 description",
"label": "Label 2",
"value": "Value 2",
"id": 2
}
]}
However,
What I expecting is the following:
{
"library": {
"new": [
{
"label": "New",
"value": 0,
"description": "Freshly submitted."
},
{
"label": "New",
"value": 0,
"description": "Freshly submitted."
}
],
"old": [
{
"label": "New",
"value": 0,
"description": "Freshly submitted."
},
{
"label": "New",
"value": 0,
"description": "Freshly submitted."
}
]
}
}
I can change the Class structure and even I do, I don't know if I can get rid of the property "Key" string.
Please note that the values are stored in the database.
So I don't want to hard code Key properties and et al.
UPDATE: The class structure is as follows:
[JsonObject(Title = "library")]
public class CodeLibrary : IdentityBase
{
public string Key { get; set; }
public string Description { get; set; }
public string Label { get; set; }
public string Value { get; set; }
}
I try to migrate our old express checkout process based on PayPal classic API to new RestAPI , but a question has arisen during the new process:
How can I change shipping amount after create a payment and just before execute payment using PayPal restAPI?
Request after create payment:
{
"intent": "sale",
"payer": {
"payment_method": "paypal"
},
"transactions": [
{
"amount": {
"currency": "AUD",
"total": "100",
"details": {
"shipping": "10",
"subtotal": "75",
"tax": "15"
}
},
"description": "Transaction description.",
"item_list": {
"items": [
{
"quantity": "5",
"name": "Item Name",
"price": "15",
"currency": "AUD",
"sku": "sku"
}
]
}
}
],
"redirect_urls": {
"return_url": "http://localhost:56508/PaymentWithPayPal.aspx?guid=77096",
"cancel_url": "http://localhost:56508/PaymentWithPayPal.aspx?guid=77096"
}
}
request before execute payment:
{
"id": "PAY-12X5617352981972MKQ64KKA",
"transactions": [
{
"amount": {
"currency": "AUD",
"total": "101",
"details": {
"shipping": "11",
"subtotal": "75",
"tax": "15"
}
}
}
]
}
PayPal response back after execute payment:
{
"id": "PAY-12X5617352981972MKQ64KKA",
"create_time": "2014-10-15T00:51:52Z",
"update_time": "2014-10-15T00:52:43Z",
"intent": "sale",
"payer": {
"payment_method": "paypal",
"payer_info": {
--------------------
-----------------------------
----------------------
}
}
},
"transactions": [
{
"amount": {
"currency": "AUD",
"total": "100.00",
"details": {
"shipping": "10.00",
"subtotal": "75.00",
"tax": "15.00"
}
},
"description": "Transaction description.",
"item_list": {
"items": [
{
"quantity": "5",
"name": "Item Name",
"price": "15.00",
"currency": "AUD",
"sku": "sku"
}
],
"shipping_address": {
------------------------------
}
},
"related_resources": [
{
"sale": {
"id": "5KX17441UU9021742",
"create_time": "2014-10-15T00:51:52Z",
"update_time": "2014-10-15T00:52:43Z",
"amount": {
"currency": "AUD",
"total": "100.00"
},
"state": "completed",
"parent_payment": "PAY-12X5617352981972MKQ64KKA",
"links": [
{
"href": "https://api.sandbox.paypal.com/v1/payments/sale/5KX17441UU9021742",
"rel": "self",
"method": "GET"
},
{
"href": "https://api.sandbox.paypal.com/v1/payments/sale/5KX17441UU9021742/refund",
"rel": "refund",
"method": "POST"
},
{
"href": "https://api.sandbox.paypal.com/v1/payments/payment/PAY-12X5617352981972MKQ64KKA",
"rel": "parent_payment",
"method": "GET"
}
]
}
}
]
}
],
"state": "approved",
"links": [
{
"href": "https://api.sandbox.paypal.com/v1/payments/payment/PAY-12X5617352981972MKQ64KKA",
"rel": "self",
"method": "GET"
}
]
}
You can change the shipping amount after creating a payment . You need to pass shipping amount in the execute payment call and it will override the shipping that you set while creating the payment .
Request passed in while creating the payment :
{
"intent": "sale",
"payer": {
"payment_method": "paypal"
},
"redirect_urls": {
"return_url": "http://www.fff.com",
"cancel_url": "http://www.fff.com"
},
"transactions": [
{
"amount": {
"total": "20.00",
"currency": "USD",
"details": {
"subtotal": "18.00",
"tax": "1.00",
"shipping": "1.00"
}
},
"description": "This is payment description.",
"item_list": {
"items": [
{
"quantity": "3",
"name": "Hat",
"price": "2.00",
"sku": "product12345",
"description": "This is desc",
"currency": "USD"
},
{
"quantity": "3",
"name": "Hat",
"price": "2.00",
"sku": "product12345",
"description": "This is desc",
"currency": "USD"
},
{
"quantity": "3",
"name": "Hat",
"price": "2.00",
"sku": "product12345",
"description": "This is desc",
"currency": "USD"
}
]
}
}
]
}
While executing the payment :
https://api.sandbox.paypal.com/v1/payments/payment/PAY-2NX408505D489885FKQ6M7NA/execute/
{
"payer_id": "KQMQZ9Y7XZYBA",
"transactions": [
{
"amount": {
"total": "28.00",
"currency": "USD",
"details": {
"subtotal": "18.00",
"tax": "5.00",
"shipping": "5.00"
}
},
"description": "This is payment description.",
"item_list": {
"items": [
{
"quantity": "3",
"name": "Hat",
"price": "2.00",
"sku": "product12345",
"description": "This is desc",
"currency": "USD"
},
{
"quantity": "3",
"name": "Hat",
"price": "2.00",
"sku": "product12345",
"description": "This is desc",
"currency": "USD"
},
{
"quantity": "3",
"name": "Hat",
"price": "2.00",
"sku": "product12345",
"description": "This is desc",
"currency": "USD"
}
]
}
}
]
}
Response :
{
"id": "PAY-2NX408505DYT5005FKQ6M7NA",
"create_time": "2014-10-14T07:24:36Z",
"update_time": "2014-10-14T07:29:09Z",
"state": "approved",
"intent": "sale",
"payer": {
"payment_method": "paypal",
"payer_info": {
"email": "XXXXXXXXXXX",
"first_name": "Eshan Personal Test",
"last_name": "Account",
"payer_id": "XXXXXXXXXXXX",
"shipping_address": {
"line1": "cxas",
"line2": "asa",
"city": "FL",
"state": "FL",
"postal_code": "95616",
"country_code": "US",
"recipient_name": "Eshan Personal Test Account"
}
}
},
"transactions": [
{
"amount": {
"total": "28.00",
"currency": "USD",
"details": {
"subtotal": "18.00",
"tax": "5.00",
"shipping": "5.00"
}
},
"description": "This is payment description.",
"item_list": {
"items": [
{
"name": "Hat",
"sku": "product12345",
"price": "2.00",
"currency": "USD",
"quantity": "3",
"description": "This is desc"
},
{
"name": "Hat",
"sku": "product12345",
"price": "2.00",
"currency": "USD",
"quantity": "3",
"description": "This is desc"
},
{
"name": "Hat",
"sku": "product12345",
"price": "2.00",
"currency": "USD",
"quantity": "3",
"description": "This is desc"
}
],
"shipping_address": {
"recipient_name": "Eshan Personal Test Account",
"line1": "cxas",
"line2": "asa",
"city": "FL",
"state": "FL",
"postal_code": "95616",
"country_code": "US"
}
},
"related_resources": [
{
"sale": {
"id": "04B04851PF2563348",
"create_time": "2014-10-14T07:24:36Z",
"update_time": "2014-10-14T07:29:09Z",
"amount": {
"total": "28.00",
"currency": "USD"
},
"payment_mode": "INSTANT_TRANSFER",
"state": "completed",
"protection_eligibility": "ELIGIBLE",
"protection_eligibility_type": "ITEM_NOT_RECEIVED_ELIGIBLE,UNAUTHORIZED_PAYMENT_ELIGIBLE",
"parent_payment": "PAY-2NX408505D485005FKQ6M7NA",
"links": [
{
"href": "https://api.sandbox.paypal.com/v1/payments/sale/04B04851PF2563348",
"rel": "self",
"method": "GET"
},
{
"href": "https://api.sandbox.paypal.com/v1/payments/sale/04B04851PF2563348/refund",
"rel": "refund",
"method": "POST"
},
{
"href": "https://api.sandbox.paypal.com/v1/payments/payment/PAY-2NX408505D485005FKQ6M7NA",
"rel": "parent_payment",
"method": "GET"
}
]
}
}
]
}
],
"links": [
{
"href": "https://api.sandbox.paypal.com/v1/payments/payment/PAY-2NX408505D485005FKQ6M7NA",
"rel": "self",
"method": "GET"
}
]
}
As you can see , I have passed the new shipping amount while executing the payment and it will be final one .
It doesn't look like REST supports the Express Checkout Callback API, which is used to update shipping and tax totals within Express Checkout. It's not surprising since REST is aimed at mobile developers and they wouldn't necessarily want the extra bandwidth spent.
I need to deserialize the this json returned from grogle maps api:
{
"destination_addresses": [
"Via Medaglie D'Oro, 10, 47121 Forlì FC, Italia",
"Via Torino, 20123 Milano, Italia",
"Via Guglielmo Marconi, 71, 40121 Bologna, Italia",
"Via Irnerio, 40126 Bologna, Italia"
],
"origin_addresses": [
"Via Medaglie D'Oro, 10, 47121 Forlì FC, Italia",
"Via Torino, 20123 Milano, Italia",
"Via Guglielmo Marconi, 71, 40121 Bologna, Italia",
"Via Irnerio, 40126 Bologna, Italia"
],
"rows": [
{
"elements": [
{
"distance": {
"text": "1 m",
"value": 0
},
"duration": {
"text": "1 min",
"value": 0
},
"status": "OK"
},
{
"distance": {
"text": "286 km",
"value": 286281
},
"duration": {
"text": "2 ore 48 min",
"value": 10083
},
"status": "OK"
},
{
"distance": {
"text": "80,1 km",
"value": 80088
},
"duration": {
"text": "1 ora 3 min",
"value": 3789
},
"status": "OK"
},
{
"distance": {
"text": "77,6 km",
"value": 77594
},
"duration": {
"text": "57 min",
"value": 3422
},
"status": "OK"
}
]
},
{
"elements": [
{
"distance": {
"text": "288 km",
"value": 287811
},
"duration": {
"text": "2 ore 48 min",
"value": 10052
},
"status": "OK"
},
{
"distance": {
"text": "1 m",
"value": 0
},
"duration": {
"text": "1 min",
"value": 0
},
"status": "OK"
},
{
"distance": {
"text": "212 km",
"value": 212423
},
"duration": {
"text": "2 ore 8 min",
"value": 7664
},
"status": "OK"
},
{
"distance": {
"text": "218 km",
"value": 218219
},
"duration": {
"text": "2 ore 9 min",
"value": 7740
},
"status": "OK"
}
]
},
{
"elements": [
{
"distance": {
"text": "78,5 km",
"value": 78528
},
"duration": {
"text": "56 min",
"value": 3346
},
"status": "OK"
},
{
"distance": {
"text": "212 km",
"value": 212190
},
"duration": {
"text": "2 ore 5 min",
"value": 7519
},
"status": "OK"
},
{
"distance": {
"text": "1 m",
"value": 0
},
"duration": {
"text": "1 min",
"value": 0
},
"status": "OK"
},
{
"distance": {
"text": "2,0 km",
"value": 1979
},
"duration": {
"text": "5 min",
"value": 316
},
"status": "OK"
}
]
},
{
"elements": [
{
"distance": {
"text": "74,7 km",
"value": 74719
},
"duration": {
"text": "55 min",
"value": 3278
},
"status": "OK"
},
{
"distance": {
"text": "218 km",
"value": 217951
},
"duration": {
"text": "2 ore 9 min",
"value": 7712
},
"status": "OK"
},
{
"distance": {
"text": "3,8 km",
"value": 3782
},
"duration": {
"text": "11 min",
"value": 671
},
"status": "OK"
},
{
"distance": {
"text": "1 m",
"value": 0
},
"duration": {
"text": "1 min",
"value": 0
},
"status": "OK"
}
]
}
],
"status": "OK"
}
I need to create a Distance Matrix so I'm only interested in the "value" field inside "distance".
I've tried this approach:
DataSet data = JsonConvert.DeserializeObject<DataSet>(jsonResponse);
DataTable dataTab = data.Tables["Elements"];
foreach (DataRow elements in dataTab.Rows)
{
Console.WriteLine(elements["distance"]);
//Do something else here
}
But The JSonConvert returns "Additional text found in JSON string after finishing deserializing object."
You should deserialize to classes that match your data. You can generate these classes at http://json2csharp.com/.
// use like
var rootObj = JsonConvert.DeserializeObject<RootObject>(jsonResponse);
foreach (var row in rootObj.rows)
{
foreach (var element in row.elements)
{
Console.WriteLine(element.distance.text);
}
}
// you might want to change the property names to .Net conventions
// use [JsonProperty] to let the serializer know the JSON names where needed
public class Distance
{
public string text { get; set; }
public int value { get; set; }
}
public class Duration
{
public string text { get; set; }
public int value { get; set; }
}
public class Element
{
public Distance distance { get; set; }
public Duration duration { get; set; }
public string status { get; set; }
}
public class Row
{
public List<Element> elements { get; set; }
}
public class RootObject
{
public List<string> destination_addresses { get; set; }
public List<string> origin_addresses { get; set; }
public List<Row> rows { get; set; }
public string status { get; set; }
}
I believe the issue is with the cast to 'DataSet' based on a similar question I found searching Stack Overflow.
Try this as I believe it would work (you may need to use 'rows' instead of 'Elements', but I believe the approach of using a JObject will resolve the primary issue of the 'additional text'.
JObject json = JsonConvert.DeserializeObject<JObject>(jsonResponse);
foreach (Dictionary<string, object> item in data["Elements"])
{
foreach (string val in item.Values) {
Console.WriteLine(val);
}
}
Using dynamic :
dynamic json = JsonConvert.DeserializeObject(jsonResponse);
var rowCount = json.rows.Count;
Func<dynamic, int> getElementCount = r => r.elements.Count;
var maxElements = Enumerable.Max(json.rows, getElementCount);
var matrix = new int?[rowCount, maxElements];
for(int i = 0; i < rowCount; i++)
{
var elements = json.rows[i].elements;
for(int j = 0; j < elements.Count; j++)
{
var element = elements[j];
matrix[i, j] = element.distance.value;
}
}