Match and Map fields from two lists LINQ - c#

I have two separate API requests.
The first one gives me a JSON List of Mailshake campaigns.
var requestCampaings = new RestRequest("/2017-04-01/contolerr/method", Method.GET);
In turn, I get this response.
{
"nextToken": "1545314518|240060",
"results": [
{
"object": "campaign",
"id": 36,
"title": "Email Part 2",
"created": "2019-08-12T11:50:01.442Z",
"archived": null,
"isPaused": false,
"messages": [
{
"object": "message",
"id": 7764,
"type": "initial",
"subject": "chat",
"replyToID": null,
"isPaused": false
}
],
"sender": {
"object": "sender",
"id": "359-false",
"emailAddress": "sxxxxxxxxxt#xxxxx.com",
"fromName": "xxxxxx xxxxx",
"created": "2019-05-13T14:53:49.615Z"
},
"url": "https://mailshake.com/app/#/17032/cont/360213/overview"
},
{
"object": "campaign",
"id": 359073,
"title": "TEST xxxxxx",
"created": "2019-08-09T09:16:42.286Z",
"archived": null,
"isPaused": false,
"messages": [
{
"object": "message",
"id": 774276,
"type": "initial",
"subject": "Test Test",
"replyToID": null,
"isPaused": false
}
],
"sender": {
"object": "sender",
"id": "24121-28668-false",
"emailAddress": "xxxxxxxxx#xxxxxx.xx.xx",
"fromName": "xxxxx xxxxxx",
"created": "2018-09-24T11:53:48.961Z"
},
"url": "https://mailshake.com/app/#/1/campaigns/73/overview"
},
{
"object": "xxxxx",
"id": 35,
"title": " Outreach",
"created": "2019-08-08T16:34:23.76Z",
"archived": null,
"isPaused": true,
"messages": [],
"sender": {
"object": "sender",
"id": "24121-28668-false",
"emailAddress": "xxxxx#xxxx.xx.xxx",
"fromName": "xxxxx xxxx",
"created": "2018-09-24T11:53:48.961Z"
},
"url": "https://mailshake.com/app/#/172/campaigns/3/overview"
},...
}
I store this response in OpenResponseViewModel
var campaings = JsonConvert.DeserializeObject<OpensResponseViewModel>(contentCampaings).Results;
then I filter it out into Response Model as an element in list for every campaign.
var campaingsIds = campaings.Select(a => new Response() { CampaignId = a.Id, SenderEmail = a.Sender.EmailAddress }).ToList();
Simular for the second call to the API I get all open emails as JSON.
var info = JsonConvert.DeserializeObject(contentOpens).Results;
var emailClicked = info.Where(x=>x.IsDuplicate==false).Select(a => new Response() { CampaignId = a.Campaign.Id, RecipientIEmail = a.Recipient.EmailAddress }).ToList();
So basically I get two lists of objects.
CampaingId: 360213
RecipientEmailAddress : null
SenderEmailAddress : sender360213#mail.com
CampaingId: 358593
RecipientEmailAddress : null
SenderEmailAddress : sender358593#mail.com
and
CampaingId: 358593
RecipientEmailAddress : recipient#mail.com
SenderEmailAddress : null
CampaingId: 360213
RecipientEmailAddress : recipient#mail.com
SenderEmailAddress : null
What I need is match the CampaingId from the first list to the CampaingId from the second list into 3rd list to get the SenderEmailAddress.
and get a list of objects like this
CampaingId: 358593
RecipientEmailAddress : recipient#mail.com
SenderEmailAddress : sender358593#mail.com
CampaingId: 360213
RecipientEmailAddress : recipient#mail.com
SenderEmailAddress : sender360213#mail.com
how do i do this witl LINQ

Join the lists:
var q = from c in campaingsIds
join e in emailClicked on c.CampaingId equals e.CampaingId
select new Response()
{
CampaingId = c.CampaingId,
RecipientEmailAddress = e.RecipientEmailAddress,
SenderEmailAddress = c.SenderEmailAddress
};

Related

Filter data from deep json child

the JSON below is taken from other post. My issue is I know the id and I want to find out where is it located. Eg, I got ID 19006 and I want to get Folder2. How am I going to do this.
{
"data": {
"id": 0,
"name": "",
"childFolders": [{
"id": 19002,
"name": "Locker",
"childFolders": [{
"id": 19003,
"name": "Folder1",
"childFolders": [],
"childComponents": [{
"id": 19005,
"name": "route1",
"state": "STOPPED",
"type": "ROUTE"
}]
}, {
"id": 19004,
"name": "Folder2",
"childFolders": [],
"childComponents": [{
"id": 19008,
"name": "comm1",
"state": "STOPPED",
"type": "COMMUNICATION_POINT"
}, {
"id": 19006,
"name": "route2",
"state": "STOPPED",
"type": "ROUTE"
}, {
"id": 19007,
"name": "route3",
"state": "STOPPED",
"type": "ROUTE"
}]
}],
"childComponents": []
}],
"childComponents": []
},
"error": null
}
I write code now it is like this:
var json = GetJsonString();
var model = GetJsonModel(json);
var folderName = GetName(model.data, 19006);
I chekced and code is correct. folderName is Folder2
And the recursive code:
private string GetName(Data data, int searchValue)
{
var folderName = data.name;
foreach (var item in data.childComponents)
{
if (item.id == searchValue)
{
return folderName;
}
}
if (data.childFolders.Length > 0)
{
foreach (var item in data.childFolders)
{
var folderName1 = GetName(item, searchValue);
if (folderName1 != null)
{
return folderName1;
}
}
}
return null;
}
Your model is like this:
EDIT:
I parse Json like this.
return JsonSerializer.Deserialize<YourJson>(test);

can't put content from restsharp to db

I am working with some API in C# Winforms. Getting response successfully as a json. The problem is that when I deserialize it the output is just a big string like this:
{"orders": [
{
"id": 155971090,
"date_created": "2021-06-18T06:16:31.36202+03:00",
"date_modified": "2021-06-19T15:10:45.567327+03:00",
"client_first_name": "Олександр",
"client_second_name": "",
"client_last_name": "Бандура",
"client_id": 133374423,
"client_avg_rating": 5.0,
"email": "bandurao#ukr.net",
"phone": "+380996461421",
"delivery_option": {
"id": 13662439,
"name": "Доставка \"Нова Пошта\""
},
"delivery_address": "Ананьїв, №1: вул. Незалежності, 19",
"delivery_provider_data": {
"provider": "nova_poshta",
"type": "W2W",
"sender_warehouse_id": null,
"recipient_warehouse_id": "4049834c-e1c2-11e3-8c4a-0050568002cf",
"declaration_number": null
},
"delivery_cost": 0,
"payment_option": {
"id": 7451891,
"name": "Передоплата"
},
"payment_data": null,
"price": "169,72 грн.",
"full_price": "169,72 грн.",
"client_notes": "",
"products": [
{
"id": 1430223923,
"external_id": "513.4769",
"name": "Ремень 4L-240",
"name_multilang": {
"ru": "Ремень 4L-240",
"uk": "Ремінь 4L-240"
},
"sku": "4769",
"price": "21,76 грн.",
"quantity": 1.0,
"measure_unit": "шт.",
"image": "https://images.ua.prom.st/3169964688_w100_h100_remen-4l-240.jpg",
"url": "https://teomax.com.ua/p1430223923-remen-240.html",
"total_price": "21,76 грн.",
"cpa_commission": {
"amount": "1.00"
}
},
{
"id": 1430222732,
"external_id": "512.4825",
"name": "Ремень 240 PJ3",
"name_multilang": {
"ru": "Ремень 240 PJ3",
"uk": "Ремінь 240 PJ3"
},
"sku": "4825",
"price": "48,96 грн.",
"quantity": 1.0,
"measure_unit": "шт.",
"image": "https://images.ua.prom.st/3170015051_w100_h100_remen-240-pj3.jpg",
"url": "https://teomax.com.ua/p1430222732-remen-240-pj3.html",
"total_price": "48,96 грн.",
"cpa_commission": {
"amount": "2.25"
}
},
{
"id": 1430230819,
"external_id": "297.2885",
"name": "Масло \"двухтактное\" (2Т), 1л",
"name_multilang": {
"ru": "Масло \"двухтактное\" (2Т), 1л",
"uk": "Масло \"двотактне\" (2Т), 1л"
},
"sku": "2885",
"price": "99 грн.",
"quantity": 1.0,
"measure_unit": "шт.",
"image": "https://images.ua.prom.st/3169999571_w100_h100_maslo-dvuhtaktnoe-2t.jpg",
"url": "https://teomax.com.ua/p1430230819-maslo-dvuhtaktnoe.html",
"total_price": "99 грн.",
"cpa_commission": {
"amount": "4.55"
}
}
],
"status": "delivered",
"status_name": "Выполнен",
"source": "portal",
"price_with_special_offer": null,
"special_offer_discount": null,
"special_offer_promocode": null,
"has_order_promo_free_delivery": false,
"cpa_commission": {
"amount": "7.80",
"is_refunded": false
},
"utm": null
},
{
"id": 155896081,
"date_created": "2021-06-17T13:11:40.241146+03:00",
"date_modified": "2021-06-17T13:42:55.021203+03:00",
"client_first_name": "Антон",
"client_second_name": "",
"client_last_name": "Подосельник",
"client_id": 133299120,
"client_avg_rating": 5.0,
"email": "a.n.podoselnik#gmail.com",
"phone": "+380992764450",
"delivery_option": {
"id": 13662439,
"name": "Доставка \"Нова Пошта\""
},
"delivery_address": "Киев, №132 (до 30 кг): просп. Леся Курбаса, 16-А",
"delivery_provider_data": {
"provider": "nova_poshta",
"type": "W2W",
"sender_warehouse_id": null,
"recipient_warehouse_id": "51b6c251-7a06-11e4-acce-0050568002cf",
"declaration_number": null
},
"delivery_cost": 0,
"payment_option": {
"id": 7451890,
"name": "Готівкою"
},
"payment_data": null,
"price": "254,30 грн.",
"full_price": "254,30 грн.",
"client_notes": "",
"products": [
{
"id": 1430208419,
"external_id": "250.4391",
"name": "Подшипник шариковый 12*30*8",
"name_multilang": {
"ru": "Подшипник шариковый 12*30*8",
"uk": "Підшипник кульковий 12*30*8"
},
"sku": "4391",
"price": "50,86 грн.",
"quantity": 5.0,
"measure_unit": "шт.",
"image": "https://images.ua.prom.st/3169911780_w100_h100_podshipnik-sharikovyj-12308.jpg",
"url": "https://teomax.com.ua/p1430208419-podshipnik-sharikovyj-12308.html",
"total_price": "254,30 грн.",
"cpa_commission": {
"amount": "5.08"
}
}
],
"status": "canceled",
"status_name": "Отменен",
"source": "portal",
"price_with_special_offer": null,
"special_offer_discount": null,
"special_offer_promocode": null,
"has_order_promo_free_delivery": false,
"cpa_commission": {
"amount": "5.08",
"is_refunded": true
},
"utm": null
},
{
"id": 155881650,
"date_created": "2021-06-17T11:36:11.87828+03:00",
"date_modified": "2021-06-17T13:10:11.527256+03:00",
"client_first_name": "Антон",
"client_second_name": "",
"client_last_name": "Подосельник",
"client_id": 133299120,
"client_avg_rating": 5.0,
"email": "a.n.podoselnik#gmail.com",
"phone": "+380992764450",
"delivery_option": {
"id": 13662439,
"name": "Доставка \"Нова Пошта\""
},
"delivery_address": "Киев, №132 (до 30 кг): просп. Леся Курбаса, 16-А",
"delivery_provider_data": {
"provider": "nova_poshta",
"type": "W2W",
"sender_warehouse_id": null,
"recipient_warehouse_id": "51b6c251-7a06-11e4-acce-0050568002cf",
"declaration_number": null
},
"delivery_cost": 0,
"payment_option": {
"id": 7451890,
"name": "Готівкою"
},
"payment_data": null,
"price": "305,16 грн.",
"full_price": "305,16 грн.",
"client_notes": "",
"products": [
{
"id": 1430208419,
"external_id": "250.4391",
"name": "Подшипник шариковый 12*30*8",
"name_multilang": {
"ru": "Подшипник шариковый 12*30*8",
"uk": "Підшипник кульковий 12*30*8"
},
"sku": "4391",
"price": "50,86 грн.",
"quantity": 6.0,
"measure_unit": "шт.",
"image": "https://images.ua.prom.st/3169911780_w100_h100_podshipnik-sharikovyj-12308.jpg",
"url": "https://teomax.com.ua/p1430208419-podshipnik-sharikovyj-12308.html",
"total_price": "305,16 грн.",
"cpa_commission": {
"amount": "6.10"
}
}
],
"status": "canceled",
"status_name": "Отменен",
"source": "portal",
"price_with_special_offer": null,
"special_offer_discount": null,
"special_offer_promocode": null,
"has_order_promo_free_delivery": false,
"cpa_commission": {
"amount": "6.10",
"is_refunded": true
},
"utm": null
}
]}
My function to get this is like this:
public IRestResponse GetOrders()
{
var connection = new RestClient("https://my.prom.ua/api/v1/");
connection.UseNewtonsoftJson();
var request = new RestRequest("orders/list", Method.GET, DataFormat.None);
request.AddHeader("authorization", "Bearer token");
var response = connection.Get(request);
//var things = JsonConvert.DeserializeObject<Dictionary<string, string>>(response.Content);
Console.WriteLine(response.Content);
return response;
}
Then I tried to make json object out of it and deserialize:
var jsonString = JToken.Parse(data.Content);
var obj = JObject.Parse(jsonString.ToString());
How can I make key value pair out of this and be able to put data into a db table?

Is there a way to sum the values directly in C# without hitting cosmosDB and run a query?

I am trying to find a way to sum the prices held in an array, the way I am doing it now is to save the document to CosmosDB then run an additional sum(foo) query on it but I am thinking there must be a way so simply do that directly before I save the document to CosmosDB to save the extra round trip to the DocumentDB.
Example Document below.
The values I want to summarise are under:
ApiInputObject.TransactionDetails.Items.Price and there can of course be many items in the array.
I can only figure out how to get a single value out but that seems very inefficient.
{
"InternalTransactionlId": "XXX",
"DocumentType": "order",
"ExternalTransactionId": "externalIdTest2",
"OrderBotResponse": {
"id": "XXX",
"status": "pending",
"checkoutUrl": "https://www.example.com",
"items": [
{
"attributes": {
"color": "Midnight blue",
"size": "L"
},
"price": "500",
"quantity": "1",
"shipping": "0.0",
"title": "ACME Title",
"url": "https://example.com",
"product_id": "XXX",
"imageUrl": "https://example.com/image.jpg",
"status": "pending",
"shippingMethod": "default",
"totalPrice": 500
}
],
"reference": "XXX",
"currency": "SEK",
"country": "SE",
"language": "sv-se",
"provider": "acme",
"callback": {
"refund": "http://example.com",
"success": "http://example.com"
},
"shippingAddress": {},
"logs": [
{
"t": "2019-08-24T20:58:04.844+08:00",
"m": "Created"
}
],
"meta": {
"error": 0
}
},
"ApiInputObject": {
"ApiKey": "XXX",
"OrderType": "directTransaction",
"SourceSystem": {
"SourceSystemName": "ACME"
},
"SourceSystemCountry": "SE",
"DestinationSystem": {
"DestinationSystemName": "acme.com"
},
"DestinationSystemCountry": {
"DestinationSystemCountryName": "SE"
},
"Brand": {
"BrandName": "ACME"
},
"RequestedFeatures": [
"NONE"
],
"ExternalTransactionId": "externalIdTest2",
"TransactionDetails": {
"callback": {
"refund": "http://example.com",
"success": "http://example.com"
},
"items": [
{
"attributes": {
"color": "Midnight blue",
"size": "L"
},
"price": "500",
"quantity": "1",
"shipping": "0.0",
"title": "ACME",
"url": "https://example.com"
}
],
"test": "true",
"reference": "XXX"
}
},
"id": "XXX",
"_rid": "XXX",
"_self": "XXX",
"_etag": "XXX",
"_attachments": "attachments/",
"_ts": 111
}
You can try to use SelectToken to get your JSON data value. then use linq SUM
JObject obj = JObject.Parse(data);
var value = obj.SelectToken("ApiInputObject.TransactionDetails.items").Sum(x=>((int)x["price"]));
c# online

.NET MVC Unable to Deserialize JSON

I am using the results from json2csharp.com on the response below from a GET request within my MVC Model:
{
"Id": 1111111,
"CreateLocation": "xxxxxxxxEZ-V12",
"ConstituentType": {
"Description": "Individual",
"Id": 1,
"Inactive": false,
"ConstituentGroup": {
"Description": "Individual",
"Id": 1,
"Inactive": false
}
},
"DisplayName": "xxxxxxxx xxxxxxxx",
"FirstName": "xxxxxxxx",
"Inactive": {
"Id": 1,
"Description": "Active",
"Inactive": false
},
"InactiveReason": null,
"LastActivityDate": "2016-10-16T02:32:15Z",
"LastName": "xxxxxxxx",
"MailIndicator": {
"Description": "(none)",
"Id": 3,
"Inactive": false
},
"EmarketIndicator": {
"Description": "(none)",
"Id": 3,
"Inactive": false
},
"MiddleName": "",
"NameStatus": {
"Description": " ",
"Id": 1,
"Inactive": false
},
"OriginalSource": {
"Description": "Test Test",
"Id": 4,
"Inactive": false
},
"PhoneIndicator": {
"Description": "(none)",
"Id": 3,
"Inactive": false
},
"Prefix": {
"Description": "",
"Id": -1,
"Inactive": false
},
"Gender": null,
"Suffix": {
"Description": "",
"Id": -1,
"Inactive": false
},
"Salutation": {
"BusinessTitle": null,
"CreatedDateTime": "2016-05-21T16:47:52Z",
"CreateLocation": "xxxxxxxxEZ-V12",
"Constituent": {
"Id": 8775975
},
"CreatedBy": "xxxxxxxx",
"Id": 912925,
"DefaultIndicator": true,
"EnvelopeSalutation1": "xxxxxxxx xxxxxxxx",
"EnvelopeSalutation2": "",
"Label": true,
"UpdatedDateTime": "2016-05-21T16:47:52.937Z",
"UpdatedBy": "xxxxxxxx",
"LetterSalutation": "xxxxxxxx xxxxxxxx",
"SalutationType": {
"Description": "Default",
"Id": 0,
"Inactive": false
},
"EditIndicator": true,
"IsFromAffiliation": false
},
"Address": {
"Id": 9781315,
"AffiliatedConstituent": null,
"AltSalutationType": {
"Description": "Default",
"Id": 0,
"Inactive": false
},
"AddressType": {
"Description": "Home Address",
"Id": 3,
"Inactive": false
},
"City": "Brooklyn",
"CreatedDateTime": "2016-05-21T16:47:52Z",
"CreateLocation": "xxxxxxxxEZ-V12",
"CreatedBy": "xxxxxxxx",
"Constituent": {
"Id": 8775975
},
"DeliveryPoint": "",
"EndDate": null,
"GeoArea": 35,
"Inactive": false,
"Label": true,
"UpdatedDateTime": "2016-09-21T16:00:46.497Z",
"UpdatedBy": "NCOA$STD",
"Months": "YYYYYYYYYYYY",
"NcoaAction": 3,
"NcoaSession": 9,
"PostalCode": "12121212",
"PostalCodeFormatted": "11205-2348",
"PrimaryIndicator": true,
"StartDate": null,
"State": {
"Description": "New York",
"StateCode": "NY",
"Id": 51,
"Inactive": false,
"Country": {
"Description": "USA",
"Id": 1,
"Inactive": false
}
},
"Street1": "11 Fadeaddress Ave",
"Street2": null,
"Street3": null,
"Country": {
"Description": "USA",
"Id": 1,
"Inactive": false
},
"EditIndicator": true,
"IsFromAffiliation": false
},
"ElectronicAddress": {
"Address": "test#test.edu",
"AffiliatedConstituent": null,
"AltSalutationType": null,
"CreatedDateTime": "2016-05-21T16:47:53Z",
"CreateLocation": "xxxxxxxxEZ-V12",
"CreatedBy": "xxxxxxxx",
"Constituent": {
"Id": 8775975
},
"Id": 9781317,
"ElectronicAddressType": {
"Description": "Home Email",
"Id": 1,
"Inactive": false,
"IsEmail": true
},
"EndDate": null,
"AllowHtmlFormat": true,
"Inactive": false,
"UpdatedDateTime": "2016-05-21T16:47:53.03Z",
"UpdatedBy": "xxxxxxxx",
"AllowMarketing": true,
"Months": "YYYYYYYYYYYY",
"PrimaryIndicator": true,
"StartDate": null,
"EditIndicator": true,
"IsFromAffiliation": false,
"IsEmail": true
},
"PrimaryPhoneNumbers": [
{
"Address": {
"Id": 9781315,
"AddressType": {
"Description": "Home Address",
"Id": 3,
"Inactive": false
}
},
"AllowTelemarketing": true,
"DayEveningIndicator": " ",
"Constituent": {
"Id": 8775975
},
"Id": 9781316,
"Inactive": false,
"PhoneNumber": "11111111",
"PhoneFormatted": "(917) 561-0972 ",
"PhoneSearch": "11111111",
"PhoneType": {
"Description": "Phone 1",
"Id": 1,
"Inactive": false
},
"CreatedBy": "xxxxxxxx",
"CreateLocation": "xxxxxxxxEZ-V12",
"CreatedDateTime": "2016-05-21T16:47:53Z",
"UpdatedDateTime": "2016-05-21T16:47:53.027Z",
"UpdatedBy": "xxxxxxxx",
"EditIndicator": true
}
],
"CreatedDateTime": "2015-05-23T14:03:23Z",
"CreatedBy": "xxxxxxxx",
"UpdatedDateTime": "2016-10-16T02:32:15.527Z",
"UpdatedBy": "dbo ",
"SortName": "xxxxxxxx/xxxxxxxx",
"Affiliates": [],
"ProtectionType": null
}
But when I try to deserialize the JSON output and return the results to my View with
//Storing the response details recieved from web api
var json = Res.Content.ReadAsStringAsync().Result;
//Deserializing the response recieved from web api and storing into the Employee list
EmpInfo = JsonConvert.DeserializeObject<List<Constituent>>(json);
I get the error Cannot deserialize the current JSON object...because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly. To fix this error either change the JSON to a JSON array...that can be deserialized from a JSON object.
Your example response is a single object, not an array. I can't see your implementation of Constituent but assume it matches that definition?
In which case you should be able to deserialize the single result (rather than a list) using:
EmpInfo = JsonConvert.DeserializeObject<Constituent>(json);
var result = JsonConvert.DeserializeObject<dynamic>(JSONtext)

Deserialize a multidimensional Json response

I'm currently stuck on JSON deserialization.
Here is two type of JSON, I can receive :
{
"code": 0,
"response": {
"isFollowing": false,
"isFollowedBy": false,
"connections": {
"google": {
"url": "",
"id": "c35f4e",
"name": "jean"
},
"facebook": {
"url": "https://www.facebook.com/",
"id": "1000064139",
"name": "jean mic"
}
},
"isPrimary": true,
"id": "780",
"location": "",
"isPrivate": false,
"joinedAt": "2013-10-18T16:04:09",
"username": "jeandavid",
"numLikesReceived": 0,
"about": "",
"name": "jean",
"url": "",
"profileUrl": "",
"reputation": ,
"avatar": {
"small": {
"permalink": "https://picture.jpg",
"cache": "https://picture.jpg"
},
"isCustom": false,
"permalink": "https://picture.jpg",
"cache": "/noavatar9.png",
"large": {
"permalink": "w",
"cache": "https://picture.jpg"
}
},
"isAnonymous": false
}
}
And this one :
{
"response": [
{
"uid": 2017156,
"first_name": "David",
"last_name": "Jean",
"sex": 1,
"nickname": "",
"bdate": "12.12.1990",
"photo_medium": "img.jpg"
}
]
}
At beginning, I use :
Dictionary<string, string> deserializedObj = JsonConvert.DeserializeObject<Dictionary<string, string>>(response);
But it works only with unidimensional Json data.
So after looking on Google, I tried to use :
JArray jArr = (JArray)JsonConvert.DeserializeObject(response);
foreach (var item in jArr)
{
Console.WriteLine(item);
}
But I receive this exception :
Unable to cast object of type 'Newtonsoft.Json.Linq.JObject' to type 'Newtonsoft.Json.Linq.JArray'.
For the first JSON data I would like to get the Google and Facebook data and also the username, the reputation, the avatar, the id of the user, ...
Thanks for any help!!

Categories