JSON Deserialization - handle property that can be a array - c#

Question Background:
I am querying Amazons Product Advertising API and trying to desearlize the JSON response to a C# object.
The Issue:
I have received a deserialization error when the code attempts the conversion. I can't quite work out which part is causing the error though. The following shows the error I'm receiving:
Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type'System.Collections.Generic.List`1[ShoppingComparisonEngine.AWS.AwsCommon.Item]' 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 (e.g. [1,2,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List<T>) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object.
Path 'Items.Item.ASIN', line 1, position 612.
The code:
The following C# are what the Newtonsoft is attempting to serialize to.
Item.cs:
public class Item
{
[JsonProperty("asin")]
public string ASIN { get; set; }
[JsonProperty("parentasin")]
public string ParentASIN { get; set; }
[JsonProperty("detailpageurl")]
public string DetailPageURL { get; set; }
[JsonProperty("salesrank")]
public string SalesRank { get; set; }
[JsonProperty("smallimage")]
public SmallImage SmallImage { get; set; }
[JsonProperty("mediumimage")]
public MediumImage MediumImage { get; set; }
[JsonProperty("largeimage")]
public LargeImage LargeImage { get; set; }
[JsonProperty("imagesets")]
public ImageSets ImageSets { get; set; }
[JsonProperty("itemattributes")]
public ItemAttributes ItemAttributes { get; set; }
[JsonProperty("offersummary")]
public OfferSummary OfferSummary { get; set; }
[JsonProperty("offers")]
public Offers Offers { get; set; }
}
Items.cs:
public class Items
{
[JsonProperty("totalresults")]
public string TotalResults { get; set; }
[JsonProperty("totalpages")]
public string TotalPages { get; set; }
[JsonProperty("moresearchresultsurl")]
public string MoreSearchResultsUrl { get; set; }
[JsonProperty("item")]
public List<Item> Item { get; set; }
}
JSON:
I believe this is an issue with the fact I have a singe Item whereas the conversion requires a list of them?
{
"Items": {
"xmlns": "http://webservices.amazon.com/AWSECommerceService/2011-08-01",
"Request": {
"IsValid": "True",
"ItemSearchRequest": {
"Availability": "Available",
"Condition": "New",
"ItemPage": "6",
"Keywords": "champagne bucket",
"ResponseGroup": [
"Medium",
"Offers"
],
"SearchIndex": "HomeGarden"
}
},
"TotalResults": "51",
"TotalPages": "6",
"MoreSearchResultsUrl": "http://www.amazon.co.uk/gp/redirect.html?linkCode=xm2&SubscriptionId=AKIAIFERUZJXWJ3Y2USA&location=http%3A%2F%2Fwww.amazon.co.uk%2Fgp%2Fsearch%3Fkeywords%3Dchampagne%2Bbucket%26url%3Dsearch-alias%253Doutdoor&tag=compar0c2-21&creative=12734&camp=2025",
"Item": {
"ASIN": "B00IYO4HRQ",
"DetailPageURL": "http://www.amazon.co.uk/Bottle-Holder-Accessories-Garden-Maintenance/dp/B00IYO4HRQ%3FSubscriptionId%3DAKIAIFERUZJXWJ3Y2USA%26tag%3Dcompar0c2-21%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB00IYO4HRQ",
"ItemLinks": {
"ItemLink": [
{
"Description": "Add To Wishlist",
"URL": "http://www.amazon.co.uk/gp/registry/wishlist/add-item.html%3Fasin.0%3DB00IYO4HRQ%26SubscriptionId%3DAKIAIFERUZJXWJ3Y2USA%26tag%3Dcompar0c2-21%26linkCode%3Dxm2%26camp%3D2025%26creative%3D12734%26creativeASIN%3DB00IYO4HRQ"
},
{
"Description": "Tell A Friend",
"URL": "http://www.amazon.co.uk/gp/pdp/taf/B00IYO4HRQ%3FSubscriptionId%3DAKIAIFERUZJXWJ3Y2USA%26tag%3Dcompar0c2-21%26linkCode%3Dxm2%26camp%3D2025%26creative%3D12734%26creativeASIN%3DB00IYO4HRQ"
},
{
"Description": "All Customer Reviews",
"URL": "http://www.amazon.co.uk/review/product/B00IYO4HRQ%3FSubscriptionId%3DAKIAIFERUZJXWJ3Y2USA%26tag%3Dcompar0c2-21%26linkCode%3Dxm2%26camp%3D2025%26creative%3D12734%26creativeASIN%3DB00IYO4HRQ"
},
{
"Description": "All Offers",
"URL": "http://www.amazon.co.uk/gp/offer-listing/B00IYO4HRQ%3FSubscriptionId%3DAKIAIFERUZJXWJ3Y2USA%26tag%3Dcompar0c2-21%26linkCode%3Dxm2%26camp%3D2025%26creative%3D12734%26creativeASIN%3DB00IYO4HRQ"
}
]
},
"SmallImage": {
"URL": "http://ecx.images-amazon.com/images/I/31cr9r7XChL._SL75_.jpg",
"Height": {
"Units": "pixels",
"value": "75"
},
"Width": {
"Units": "pixels",
"value": "75"
}
},
"MediumImage": {
"URL": "http://ecx.images-amazon.com/images/I/31cr9r7XChL._SL160_.jpg",
"Height": {
"Units": "pixels",
"value": "160"
},
"Width": {
"Units": "pixels",
"value": "160"
}
},
"LargeImage": {
"URL": "http://ecx.images-amazon.com/images/I/31cr9r7XChL.jpg",
"Height": {
"Units": "pixels",
"value": "300"
},
"Width": {
"Units": "pixels",
"value": "300"
}
},
"ImageSets": {
"ImageSet": [
{
"Category": "swatch",
"SwatchImage": {
"URL": "http://ecx.images-amazon.com/images/I/31lBLzzkQlL._SL30_.jpg",
"Height": {
"Units": "pixels",
"value": "30"
},
"Width": {
"Units": "pixels",
"value": "30"
}
},
"SmallImage": {
"URL": "http://ecx.images-amazon.com/images/I/31lBLzzkQlL._SL75_.jpg",
"Height": {
"Units": "pixels",
"value": "75"
},
"Width": {
"Units": "pixels",
"value": "75"
}
},
"ThumbnailImage": {
"URL": "http://ecx.images-amazon.com/images/I/31lBLzzkQlL._SL75_.jpg",
"Height": {
"Units": "pixels",
"value": "75"
},
"Width": {
"Units": "pixels",
"value": "75"
}
},
"TinyImage": {
"URL": "http://ecx.images-amazon.com/images/I/31lBLzzkQlL._SL110_.jpg",
"Height": {
"Units": "pixels",
"value": "110"
},
"Width": {
"Units": "pixels",
"value": "110"
}
},
"MediumImage": {
"URL": "http://ecx.images-amazon.com/images/I/31lBLzzkQlL._SL160_.jpg",
"Height": {
"Units": "pixels",
"value": "160"
},
"Width": {
"Units": "pixels",
"value": "160"
}
},
"LargeImage": {
"URL": "http://ecx.images-amazon.com/images/I/31lBLzzkQlL.jpg",
"Height": {
"Units": "pixels",
"value": "300"
},
"Width": {
"Units": "pixels",
"value": "300"
}
}
},
{
"Category": "primary",
"SwatchImage": {
"URL": "http://ecx.images-amazon.com/images/I/31cr9r7XChL._SL30_.jpg",
"Height": {
"Units": "pixels",
"value": "30"
},
"Width": {
"Units": "pixels",
"value": "30"
}
},
"SmallImage": {
"URL": "http://ecx.images-amazon.com/images/I/31cr9r7XChL._SL75_.jpg",
"Height": {
"Units": "pixels",
"value": "75"
},
"Width": {
"Units": "pixels",
"value": "75"
}
},
"ThumbnailImage": {
"URL": "http://ecx.images-amazon.com/images/I/31cr9r7XChL._SL75_.jpg",
"Height": {
"Units": "pixels",
"value": "75"
},
"Width": {
"Units": "pixels",
"value": "75"
}
},
"TinyImage": {
"URL": "http://ecx.images-amazon.com/images/I/31cr9r7XChL._SL110_.jpg",
"Height": {
"Units": "pixels",
"value": "110"
},
"Width": {
"Units": "pixels",
"value": "110"
}
},
"MediumImage": {
"URL": "http://ecx.images-amazon.com/images/I/31cr9r7XChL._SL160_.jpg",
"Height": {
"Units": "pixels",
"value": "160"
},
"Width": {
"Units": "pixels",
"value": "160"
}
},
"LargeImage": {
"URL": "http://ecx.images-amazon.com/images/I/31cr9r7XChL.jpg",
"Height": {
"Units": "pixels",
"value": "300"
},
"Width": {
"Units": "pixels",
"value": "300"
}
}
}
]
},
"ItemAttributes": {
"Brand": "Garden at Home",
"EAN": "5971458914919",
"EANList": {
"EANListElement": "5971458914919"
},
"Feature": "Wine Bottle Holder and Cooler Bag Wine Accessories",
"Label": "Outdoor&Lawn",
"Manufacturer": "Outdoor&Lawn",
"MPN": "GG_89773368",
"PartNumber": "GG_89773368",
"ProductGroup": "Lawn & Patio",
"ProductTypeName": "OUTDOOR_LIVING",
"Publisher": "Outdoor&Lawn",
"Studio": "Outdoor&Lawn",
"Title": "Wine Bottle Holder and Cooler Bag Wine Accessories, Garden, Lawn, Maintenance"
},
"OfferSummary": {
"LowestNewPrice": {
"Amount": "5220",
"CurrencyCode": "GBP",
"FormattedPrice": "£52.20"
},
"TotalNew": "1",
"TotalUsed": "0",
"TotalCollectible": "0",
"TotalRefurbished": "0"
},
"Offers": {
"TotalOffers": "1",
"TotalOfferPages": "1",
"MoreOffersUrl": "http://www.amazon.co.uk/gp/offer-listing/B00IYO4HRQ%3FSubscriptionId%3DAKIAIFERUZJXWJ3Y2USA%26tag%3Dcompar0c2-21%26linkCode%3Dxm2%26camp%3D2025%26creative%3D12734%26creativeASIN%3DB00IYO4HRQ",
"Offer": {
"OfferAttributes": {
"Condition": "New"
},
"OfferListing": {
"OfferListingId": "kif7varXuUaD7y55JfdjU7h3YCJvQokyXfgDIWvxOx6%2FqiMbxoPBsyFWCmgo8pbOqZNcezFUCBSdlx3JtRpEpe4Tu7VGv9zncLOYVmoSOUEDNQf1rrKJzZVCjnVPRCKyes0GSlEzlx%2Faht4%2FtjijlvCo14Z3CCcm",
"Price": {
"Amount": "5800",
"CurrencyCode": "GBP",
"FormattedPrice": "£58.00"
},
"SalePrice": {
"Amount": "5220",
"CurrencyCode": "GBP",
"FormattedPrice": "£52.20"
},
"AmountSaved": {
"Amount": "580",
"CurrencyCode": "GBP",
"FormattedPrice": "£5.80"
},
"PercentageSaved": "10",
"Availability": "Usually dispatched within 1-2 business days",
"AvailabilityAttributes": {
"AvailabilityType": "now",
"MinimumHours": "24",
"MaximumHours": "48"
},
"IsEligibleForSuperSaverShipping": "0",
"IsEligibleForPrime": "0"
}
}
},
"EditorialReviews": {
"EditorialReview": {
"Source": "Product Description",
"Content": "Ice Bucket Bag and Wine Cooler This unique Ice Bucket Bag is attractive and very durable. It is ideal for transporting wine to a friend, hostess or party and arriving with it perfectly chilled.Transparent and waterproof, this wine or Champagne bag also makes a super, space-saving ice bucket that simply folds away after use. It is especially ideal for a picnic or BBQ as it can fold for easy transport and is unbreakableIn addition, this bag makes a great party favor - comes with pocket for place card, business card or gift card. Heavy duty plastic measures 4\" x 4\" x 10\" when open, gift card slot measures 2\" x 3\".",
"IsLinkSuppressed": "0"
}
}
}
}
EDIT:
This is the code I used to create a Converter to handle both a singular Item object and a List of them.
public class ItemConverter:JsonConverter
{
public override bool CanConvert(Type objectType)
{
throw new NotImplementedException();
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.StartArray)
{
List<Item> items = serializer.Deserialize<List<Item>>(reader);
return items;
}
else
{
Item itemList = serializer.Deserialize<Item>(reader);
return new List<Item>(new[] { itemList });
}
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}

The Item property in the JSON is a plain object, not a list of objects. If it was supposed to be a list, then the JSON would be enclosed in square brackets to indicate it is an array, e.g.:
"Item": [{ item1 }, { item2}, ... ]
So you need to change your model to match. For example:
public class Items
{
//snip
public Item Item { get; set; }
}

.Net Fiddle: https://dotnetfiddle.net/9MACjN
You had multiple issues:
You are actually missing the closing } in your json.
You need to deserialize into a parent class (e.g., Response) that contains Items.
The Items.Item property needs to be of type Item, not List<Item>, as David said.
JsonProperty attributes are not needed at all.
Then it works.

Related

Not Able to Extract Full details/data from a JSON File in Unity C#

I'm trying to access data from JSON file though i am only able to extract the name while others aren't showing. I have attached both my JSON file and my C# script from unity. The Item Class list data which needs to be extracted from the JSON file i.e name, gameId, message etc.
What is Captured when running.
Here is my code - JSONreader
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class JSONreader : MonoBehaviour
{
public TextAsset txtJson;
[System.Serializable]
public class ItemList
{
public Item item;
}
[System.Serializable]
public class Item
{
public string name;
public string request;
public string key;
public string value;
public string raw;
public string type;
public string header;
public string gameId;
public float amount;
public string orderId;
public int code;
public string message;
public string transactionId;
public string description;
}
public ItemList itemList = new ItemList();
private void Start()
{
itemList = JsonUtility.FromJson<ItemList>(txtJson.text);
}
private void Update()
{
}
}
my JSON file
{
"name": "Purchase API",
"protocolProfileBehavior": {
"disabledSystemHeaders": {
"accept": true,
"user-agent": true
}
},
"request": {
"auth": {
"type": "bearer",
"bearer": [
{
"key": "token",
"value": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6InIxTGtiQm8zOTI1UmIyWkZGckt5VTNNVmV4OVQyODE3S3gwdmJpNmlfS2MifQ.eyJuYW1lIjoiU2FtcGxlIEFkbWluIFVzZXIiLCJuaWNrbmFtZSI6InRoZWFkbWluIiwiYmlvIjpudWxsLCJzdWIiOiI0MTk0NjEzYi02MTI0LTQyN2UtODk2NC0yYWY1ZGNiM2UzZjIiLCJub25jZSI6IjEyMyIsInNfaGFzaCI6ImpTUFBiSWJvTktlcWJ0N1ZUQ2JPS3ciLCJhdWQiOiJmNGQ3MTE4YS1iY2UyLTExZWMtOTliNC05ZWI3NDRmNWJiZTIiLCJleHAiOjE2NTM5MzQ1MDQsImlhdCI6MTY1MzkzMDkwNCwiaXNzIjoiaHR0cHM6Ly9pZC5qaXdlLmlvIn0.tquqwYt8htiZd27au4R4H6Zjd1VqzNJGw5xZCEQ8NRlrQvmudUz-uo4qdHNW9k71w6Di3H-qMdliuFgj7sJb0naDNIScEalw1xPlA0R8QyIB6JT8YFiAANAfYvIaM4DWYeagDdia3MXJoRnnWxgg57yzd-ZA_ws3-brh-I-1mulRiGQcZ8wgpRhk4Vp3xjvNa3FcsyJ7excPTiD5zaSdtKGSJ3J2RSOAt5n2m-R-QGe_1lwAXXR-sa7P77tyG4FmQ2gHtmCRRnZzVD0AM6fULYWwYURARTwiCki2HYWCNJsMplID99Hx5JOHzwViHtV6XioRelk0t3Gef7Jqd2gYqg",
"type": "string"
}
]
},
"method": "POST",
"header": [
{
"key": "api_secret",
"value": "5e3ca84dad0758595a8dc793beb509505e79998bac87ffde128c668ac0215a1ed0462407ac794e99b26041cc3eab266cd06ced0d530b6d02d024d6b49353dd8d",
"type": "text"
},
{
"key": "api_key",
"value": "hasuraengine",
"type": "text"
}
],
"body": {
"mode": "raw",
"raw": "{\n \"gameId\": \"JiweGameID\",\n \"amount\": 1,\n \"orderId\": \"OrderID Generated On GameDev Side\",\n \"description\": \"Charlie's Test\",\n \"applyTransactionFeeOn\": \"SENDER\",\n \"idempotencyKey\": \"SOME_KEY#2\",\n \"metadata\": {\n \"key\": \"value\"\n }\n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": {
"raw": "https://bursment.jiwe.io/api/v1/cowrie/purchases",
"protocol": "https",
"host": [
"bursment",
"jiwe",
"io"
],
"path": [
"api",
"v1",
"cowrie",
"purchases"
]
}
},
"response": [
{
"name": "Purchase API",
"originalRequest": {
"method": "POST",
"header": [
{
"key": "api_secret",
"value": "5e3ca84dad0758595a8dc793beb509505e79998bac87ffde128c668ac0215a1ed0462407ac794e99b26041cc3eab266cd06ced0d530b6d02d024d6b49353dd8d",
"type": "text"
},
{
"key": "api_key",
"value": "hasuraengine",
"type": "text"
}
],
"body": {
"mode": "raw",
"raw": "{\n \"gameId\": \"JiweGameID\",\n \"amount\": 1,\n \"orderId\": \"OrderID Generated On GameDev Side\",\n \"description\": \"Charlie's Test\",\n \"applyTransactionFeeOn\": \"SENDER\",\n \"idempotencyKey\": \"SOME_KEY#2\",\n \"metadata\": {\n \"key\": \"value\"\n }\n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": {
"raw": "https://bursment.jiwe.io/api/v1/cowrie/purchases",
"protocol": "https",
"host": [
"bursment",
"jiwe",
"io"
],
"path": [
"api",
"v1",
"cowrie",
"purchases"
]
}
},
"status": "OK",
"code": 200,
"_postman_previewlanguage": "json",
"header": [
{
"key": "Server",
"value": "nginx/1.14.0 (Ubuntu)"
},
{
"key": "Date",
"value": "Mon, 30 May 2022 18:40:17 GMT"
},
{
"key": "Content-Type",
"value": "application/json; charset=utf-8"
},
{
"key": "Content-Length",
"value": "135"
},
{
"key": "Connection",
"value": "keep-alive"
},
{
"key": "Vary",
"value": "Origin"
},
{
"key": "Rate-Limit-Remaining",
"value": "53"
},
{
"key": "Rate-Limit-Reset",
"value": "1653936052"
},
{
"key": "Rate-Limit-Total",
"value": "60"
},
{
"key": "X-DNS-Prefetch-Control",
"value": "off"
},
{
"key": "X-Frame-Options",
"value": "SAMEORIGIN"
},
{
"key": "Strict-Transport-Security",
"value": "max-age=15552000; includeSubDomains"
},
{
"key": "X-Download-Options",
"value": "noopen"
},
{
"key": "X-Content-Type-Options",
"value": "nosniff"
},
{
"key": "X-XSS-Protection",
"value": "1; mode=block"
}
],
"cookie": [],
"body": "{\n \"code\": \"200\",\n \"type\": \"SUCCESS\",\n \"message\": \"Purchase successful\",\n \"transactionId\": \"f3a4ff6c-e047-11ec-80ac-000d3a9bae12\"\n}"
}
]
},

Deserialize json data c#

I want to deserialize JSON response received by Telegram Bot API by getUpdate() method.
JSON data:
{
"ok": true,
"result": [
{
"update_id": 920493886,
"message": {
"message_id": 123,
"from": {
"id": 219633031,
"first_name": "Shreeeeeee",
"username": "Winner7777"
},
"chat": {
"id": 219633031,
"first_name": "Shreeeeeee",
"username": "Winner7777",
"type": "private"
},
"date": 1472457375,
"text": "Aata aala"
}
},
{
"update_id": 920493887,
"message": {
"message_id": 124,
"from": {
"id": 219633031,
"first_name": "Shreeeeeee",
"username": "Winner7777"
},
"chat": {
"id": 219633031,
"first_name": "Shreeeeeee",
"username": "Winner7777",
"type": "private"
},
"date": 1472457387,
"text": "Jeva tuzyakadun reply aala tevha"
}
},
{
"update_id": 920493888,
"message": {
"message_id": 125,
"from": {
"id": 219633031,
"first_name": "Shreeeeeee",
"username": "Winner7777"
},
"chat": {
"id": 219633031,
"first_name": "Shreeeeeee",
"username": "Winner7777",
"type": "private"
},
"date": 1472457443,
"text": "Deposite"
}
},
{
"update_id": 920493889,
"message": {
"message_id": 127,
"from": {
"id": 201520743,
"first_name": "Chandrakant",
"last_name": "Kumathekar",
"username": "chandrakant_k"
},
"chat": {
"id": 201520743,
"first_name": "Chandrakant",
"last_name": "Kumathekar",
"username": "chandrakant_k",
"type": "private"
},
"date": 1472457645,
"text": "\/menu",
"entities": [
{
"type": "bot_command",
"offset": 0,
"length": 5
}
]
}
},
{
"update_id": 920493890,
"message": {
"message_id": 128,
"from": {
"id": 219633031,
"first_name": "Shreeeeeee",
"username": "Winner7777"
},
"chat": {
"id": 219633031,
"first_name": "Shreeeeeee",
"username": "Winner7777",
"type": "private"
},
"date": 1472457670,
"text": "\/menu",
"entities": [
{
"type": "bot_command",
"offset": 0,
"length": 5
}
]
}
},
{
"update_id": 920493891,
"message": {
"message_id": 130,
"from": {
"id": 201520743,
"first_name": "Chandrakant",
"last_name": "Kumathekar",
"username": "chandrakant_k"
},
"chat": {
"id": 201520743,
"first_name": "Chandrakant",
"last_name": "Kumathekar",
"username": "chandrakant_k",
"type": "private"
},
"date": 1472457848,
"text": "Deposite"
}
},
{
"update_id": 920493892,
"message": {
"message_id": 132,
"from": {
"id": 201520743,
"first_name": "Chandrakant",
"last_name": "Kumathekar",
"username": "chandrakant_k"
},
"chat": {
"id": 201520743,
"first_name": "Chandrakant",
"last_name": "Kumathekar",
"username": "chandrakant_k",
"type": "private"
},
"date": 1472457883,
"text": "Deposite"
}
},
{
"update_id": 920493893,
"message": {
"message_id": 133,
"from": {
"id": 219633031,
"first_name": "Shreeeeeee",
"username": "Winner7777"
},
"chat": {
"id": 219633031,
"first_name": "Shreeeeeee",
"username": "Winner7777",
"type": "private"
},
"date": 1472468407,
"text": "\/menu",
"entities": [
{
"type": "bot_command",
"offset": 0,
"length": 5
}
]
}
},
{
"update_id": 920493894,
"message": {
"message_id": 134,
"from": {
"id": 219633031,
"first_name": "Shreeeeeee",
"username": "Winner7777"
},
"chat": {
"id": 219633031,
"first_name": "Shreeeeeee",
"username": "Winner7777",
"type": "private"
},
"date": 1472473070,
"text": "\/menu",
"entities": [
{
"type": "bot_command",
"offset": 0,
"length": 5
}
]
}
}
]
}
I have generated classes from json2csharp
public class From
{
public int id { get; set; }
public string first_name { get; set; }
public string last_name { get; set; }
public string username { get; set; }
}
public class Chat
{
public int id { get; set; }
public string first_name { get; set; }
public string last_name { get; set; }
public string type { get; set; }
public string username { get; set; }
}
public class Entity
{
public string type { get; set; }
public int offset { get; set; }
public int length { get; set; }
}
public class Message
{
public int message_id { get; set; }
public From from { get; set; }
public Chat chat { get; set; }
public int date { get; set; }
public string text { get; set; }
public List<Entity> entities { get; set; }
}
public class Result
{
public int update_id { get; set; }
public Message message { get; set; }
}
public class RootObject
{
public bool ok { get; set; }
public List<Result> result { get; set; }
}
using newtonsoft to deserialization
var d = Newtonsoft.Json.JsonConvert.DeserializeObject(rcvd_data);
what to do next? how to put this all at work? I am confused please help.
To deserialization use this code:
RootObject ro = JsonConvert.DeserializeObject<RootObject>(rcvd_data);
And in ro you have all data.
EXAMPLE
bool ok = ro.ok;
foreach(Result r in ro.result)
{
int uId = r.update_id;
Message m = r.message;
int msgId = m.message_id;
}
string data = #"{""ok"":true,""result"":[{""update_id"":920493886,...";
RootObject ro = Newtonsoft.Json.JsonConvert.DeserializeObject<RootObject>(data);
foreach (Result result in ro.result)
{
//two example fields
Console.WriteLine("update_id= " + result.update_id);
Console.WriteLine("message text= "+result.message.text);
}
Based on: https://yts.am/api/v2/list_movies.json (Source: https://yts.am/api)
I used: http://json2csharp.com/ to create classes
Copy and paste the result of the get request of postman to json2csharp to automatically create the classes that you need
And once created, i used them on a Service like this:
private string URL = "https://yts.am/api/v2/list_movies.json";
public async Task<List<Movie>> GetMovies()
{
var httpClient = new HttpClient();
var json = await httpClient.GetStringAsync(URL);
RootObject lista = Newtonsoft.Json.JsonConvert.DeserializeObject<RootObject>(json);
List<Movie> todoes = lista.data.movies;
return todoes;
}
I'm using Newtonsoft.Json
Try this way
var d = Newtonsoft.Json.JsonConvert.DeserializeObject<RootObject>(rcvd_‌​data);
then d will contain list of RootObject. By iterating using foreach you can get all the properties of RootObject model

how to convert json code to getset property

i have following code any one tell me how to convert this in class automatically .its very hard to convert code..please help me
[{
"karhoo_ref": "4325226970648863",
"supplier_company": "supplier1",
"booking_id": "32434234234",
"notes": "waited at southeast corner",
"status": "completed",
"vehicle": {
"vehicle_type": "suv",
"vehicle_id": "404",
"vehicle_plate": "BD51SMR",
"latitude": 40.73892,
"longitude": -73.9873663,
"eta_minutes": null,
"make": "Cadillac",
"model": "Escalade",
"color": "Black",
"eta_minutes": null,
"driver_id": "12121",
"driver_phone": "+14157854978",
"driver_first_name": "Sam",
"driver_last_name": "Smith",
"direction": {
"kph": 20,
"heading": 90
}
},
"total": 29.10,
"currency": "USD"
"price_components": [{
"component_name": "base rate",
"value": 27.10,
"description": "Base Rate"
}, {
"component_name": "parking",
"value": 0,
"description": "Parking"
}, {
"component_name": "tolls",
"value": 0,
"description": "Tolls"
}, {
"component_name": "meet greet",
"value": 0,
"description": "Meet & Greet",
"currency": "USD"
}, {
"component_name": "stop charges",
"value": 0,
"description": "Stop Charges"
}, {
"component_name": "wait time charges",
"value": 0,
"description": "Wait Time charges"
}, {
"component_name": "discount",
"value": 0,
"description": "Discount"
}, {
"component_name": "misc fee",
"value": 0,
"description": "Misc"
}, {
"component_name": "fuel surcharge",
"value": 0,
"description": "Fuel Surcharge"
}, {
"component_name": "service charge",
"value": 0,
"description": "Service Charge"
}, {
"component_name": "gratuity",
"value": 0,
"description": "Tips"
}, {
"component_name": "workers comp tax",
"value": 0,
"description": "NYC Workers Comp Tax"
}, {
"component_name": "tax",
"value": 2.00,
"description": "8.75% State"
}]
}, {
"karhoo_ref": "2825226970648863",
"supplier_company": "supplier2",
"booking_id": "ABC2155",
"notes": "waited at southeast corner",
"status": "completed",
"vehicle": {
"vehicle_type": "sedan",
"vehicle_id": "404",
"vehicle_plate": "BD51SMR",
"latitude": 40.73892,
"longitude": -73.9873663,
"eta_minutes": null,
"make": "Toyota",
"model": "Camery",
"color": "Black",
"driver_id": "12121",
"driver_phone": "4157854978",
"driver_first_name": "Sam",
"driver_last_name": "Smith",
"direction": {
"kph": 20,
"heading": 90
}
},
"total": 27.10,
"currency": "USD"
"price_components": [{
"component_name": "base rate",
"value": 27.10,
"description": "Base Rate"
}]
}]
i want like this.
public class ToLocation
{
public ToLocation()
{
address = new Address2();
}
public double latitude { get; set; }
public double longitude { get; set; }
public Address2 address { get; set; }
public object comment { get; set; }
public object airport { get; set; }
}
I think you should first check whether your string is a valid Json.
You may check below link to convert to class.
How to auto-generate a C# class file from a JSON object string
You're looking for this
Using the dynamic object type. Of course you can do some casting or data mapping later on.
Have a look at JSON.Net. Download the nuget package, than use:
dynamic dyn_json = JsonConvert.DeserializeObject(json);
After that you can iterate through the dynamic object and fill your C# object.

Deserializing JSON data from Thomson Reuters API

I need get data from this JSON file, but I'm not able to get the data using C# and Newtonsoft. Can anyone help me to solve this issue? The data is from the Thomson Reuters API. I've tried other articles, but it's always a failure.
JSON:
{
"RequestKey": {
"NameType": "RIC",
"Service": "IDN",
"Name": "AEDMYR=R"
},
"QoS": {
"TimelinessInfo": {
"TimeInfo": 0,
"Timeliness": "REALTIME"
},
"RateInfo": {
"TimeInfo": 0,
"Rate": "TICK_BY_TICK"
}
},
"Status": {
"StatusMsg": "OK",
"StatusCode": 0
},
"Fields": {
"Field": [
{
"Name": "HIGH_1",
"DataType": "Double",
"Double": 117.3428
},
{
"Name": "LOW_1",
"DataType": "Double",
"Double": 117.0143
},
{
"Name": "YRHIGH",
"DataType": "Double",
"Double": 121.8861
},
{
"Name": "YRLOW",
"DataType": "Double",
"Double": 95.205
},
{
"Name": "HIGH_TIME",
"DataType": "Utf8String",
"Utf8String": "03:33"
},
{
"Name": "LOW_TIME",
"DataType": "Utf8String",
"Utf8String": "02:55"
},
{
"Name": "BKGD_REF",
"DataType": "Utf8String",
"Utf8String": "UAEDir/MalayRgt"
},
{
"Name": "GEN_TEXT16",
"DataType": "Utf8String",
"Utf8String": "AED vs MYR"
},
{
"Name": "GV2_TEXT",
"DataType": "Utf8String",
"Utf8String": "AEDMYR"
},
{
"Name": "VALUE_TS1",
"DataType": "Utf8String",
"Utf8String": "08:48:00"
},
{
"Name": "VALUE_TS2",
"DataType": "Utf8String",
"Utf8String": "08:47:01"
},
{
"Name": "VALUE_TS3",
"DataType": "Utf8String",
"Utf8String": "08:46:01"
},
{
"Name": "MONTH_HIGH",
"DataType": "Double",
"Double": 118.0954
},
{
"Name": "MONTH_LOW",
"DataType": "Double",
"Double": 114.0702
},
{
"Name": "WEEK_HIGH",
"DataType": "Double",
"Double": 117.3428
},
{
"Name": "WEEK_LOW",
"DataType": "Double",
"Double": 116.8654
},
{
"Name": "SCALING",
"DataType": "Utf8String",
"Utf8String": "100"
},
{
"Name": "CF_ASK",
"DataType": "Double",
"Double": 117.4272
},
{
"Name": "CF_BID",
"DataType": "Double",
"Double": 117.2443
},
{
"Name": "CF_CLOSE",
"DataType": "Double",
"Double": 116.7792
},
{
"Name": "CF_DATE",
"DataType": "Utf8String",
"Utf8String": "23 DEC 2015"
},
{
"Name": "CF_HIGH",
"DataType": "Double",
"Double": 117.3428
},
{
"Name": "CF_LAST",
"DataType": "Double",
"Double": 117.2443
},
{
"Name": "CF_LOW",
"DataType": "Double",
"Double": 117.0143
},
{
"Name": "CF_NETCHNG",
"DataType": "Double",
"Double": 0.4651
},
{
"Name": "CF_OPEN",
"DataType": "Double",
"Double": 116.7792
},
{
"Name": "CF_SOURCE",
"DataType": "Utf8String",
"Utf8String": "ThomRtrs"
},
{
"Name": "CF_TICK",
"DataType": "Utf8String",
"Utf8String": "⇧"
},
{
"Name": "CF_TIME",
"DataType": "Utf8String",
"Utf8String": "08:48:00"
},
{
"Name": "CF_NAME",
"DataType": "Utf8String",
"Utf8String": "UAEDir/MalayRgt"
},
{
"Name": "BQOS",
"DataType": "Utf8String",
"Utf8String": "0"
},
{
"Name": "PQOS",
"DataType": "Utf8String",
"Utf8String": "RT"
},
{
"Name": "ConcreteService",
"DataType": "Utf8String",
"Utf8String": "IDN_FD3"
},
{
"Name": "MSG_TYPE",
"DataType": "Int32",
"Int32": 0
},
{
"Name": "REC_STATUS",
"DataType": "Int32",
"Int32": 0
}
]
}
}
Deserialization code:
var result = "";
using (var objStreamReader = new StreamReader("RetrieveItem_Response_2.json"))
{
result = objStreamReader.ReadToEnd();
}
JObject joResponse = JObject.Parse(result);
JArray joArray = (JArray)(joResponse["RetrieveItem_Response_2"]["ItemResponse"]);
List<Rootobject> objRootobject = JsonConvert.DeserializeObject<List<Rootobject>>(joArray.ToString());
C# Classes:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
public class Rootobject
{
public Requestkey RequestKey { get; set; }
public Qos QoS { get; set; }
public Status Status { get; set; }
public Fields Fields { get; set; }
}
public class Requestkey
{
public string NameType { get; set; }
public string Service { get; set; }
public string Name { get; set; }
}
public class Qos
{
public Timelinessinfo TimelinessInfo { get; set; }
public Rateinfo RateInfo { get; set; }
}
public class Timelinessinfo
{
public int TimeInfo { get; set; }
public string Timeliness { get; set; }
}
public class Rateinfo
{
public int TimeInfo { get; set; }
public string Rate { get; set; }
}
public class Status
{
public string StatusMsg { get; set; }
public int StatusCode { get; set; }
}
public class Fields
{
public Field[] Field { get; set; }
}
public class Field
{
public string Name { get; set; }
public string DataType { get; set; }
public float Double { get; set; }
public string Utf8String { get; set; }
public int Int32 { get; set; }
}
It looks like you have all of your classes defined correctly. To deserialize the JSON you just need to do this:
Rootobject obj = JsonConvert.DeserializeObject<Rootobject>(result);
You can dump out the field values like this:
foreach (Field f in obj.Fields.Field)
{
string value;
switch (f.DataType)
{
case "Utf8String": value = f.Utf8String; break;
case "Double": value = f.Double.ToString(); break;
case "Int32": value = f.Int32.ToString(); break;
default: value = "(unknown)"; break;
}
Console.WriteLine(f.Name + ": " + value);
}
Fiddle: https://dotnetfiddle.net/JD3jPD

Deserialize a JObject to a list of .NET objects

The task I have is to parse JSON into objects which can then create a form. This form can have sub-forms within it and it is this step I am having difficulty with.
Consider this JObject which is a representation of the sub-form and, because the main form has already been deserialized, is now passed as a JObject:
{
"3705": {
"type": "radioGroup",
"label": "Loft Insulation Applicable",
"default_value": null,
"order": "2",
"required": "false",
"security": "false",
"option": null,
"child": [
{
"type": "radio",
"label": "No",
"order": "3"
},
{
"type": "radio",
"label": "Yes",
"order": "4"
}
]
},
"3708": {
"type": "input",
"label": "Existing Depth (mm)",
"default_value": null,
"order": "5",
"required": "false",
"security": "false",
"option": null
},
"3709": {
"type": "input",
"label": "Required Depth (mm)",
"default_value": null,
"order": "6",
"required": "false",
"security": "false",
"option": null
},
"3715": {
"type": "radioGroup",
"label": "Total Pipework Meterage",
"default_value": null,
"order": "16",
"required": "false",
"security": "false",
"option": null,
"child": [
{
"type": "radio",
"label": "15 mm",
"order": "17"
},
{
"type": "radio",
"label": "22 mm",
"order": "18"
},
{
"type": "radio",
"label": "28 mm",
"order": "19"
}
]
},
"3719": {
"type": "formLabel",
"label": "Loft Access Requirements",
"default_value": null,
"order": "20",
"required": "false",
"security": "false",
"option": null
},
"3720": {
"type": "radioGroup",
"label": "Crawlers",
"default_value": null,
"order": "21",
"required": "false",
"security": "false",
"option": null,
"child": [
{
"type": "radio",
"label": "No",
"order": "22"
},
{
"type": "radio",
"label": "Yes",
"order": "23"
}
]
},
"3723": {
"type": "radioGroup",
"label": "Cavity Ladders for Loft",
"default_value": null,
"order": "24",
"required": "false",
"security": "false",
"option": null,
"child": [
{
"type": "radio",
"label": "No",
"order": "25"
},
{
"type": "radio",
"label": "Yes",
"order": "26"
}
]
},
"3726": {
"type": "image",
"label": "Loft Photos",
"default_value": null,
"order": "27",
"required": "false",
"security": "false",
"option": null
}
}
I am trying to Deserialize it to a list of objects of types defined in this class:
public class DBFormField
{
public string type { get; set; }
public string label { get; set; }
public string default_value { get; set; }
public string order { get; set; }
public string required { get; set; }
public DBFormFieldOption option = new DBFormFieldOption();
public List<DBFormFieldChild> child = new List<DBFormFieldChild>();
}
public class DBFormFieldOption
{
public List<DBFormFieldGrid> grid_rows = new List<DBFormFieldGrid>();
public List<DBFormFieldGrid> grid_columns = new List<DBFormFieldGrid>();
public string label1 { get; set; }
public string label2 { get; set; }
public string result_label { get; set; }
public string operation { get; set; }
public List<string> rows = new List<string>();
public string tab_id { get; set; }
}
public class DBFormFieldChild
{
public string type { get; set; }
public string label { get; set; }
public string order { get; set; }
}
public class DBFormFieldGrid
{
public string title { get; set; }
public string name { get; set; }
}
I have tried a few strategies to do this. The latest, I was trying this http://james.newtonking.com/json/help/CustomCreationConverter
For example:
List<DBFormField> parsedFields = new List<DBFormField>();
parsedFields = JsonConvert.DeserializeObject<List<DBFormField>>(someFormObj.form_fields.ToString, new FormConverter()); // ToString???
...
Public Class FormConverter
Inherits Converters.CustomCreationConverter(Of DBFormField)
Public Overrides Function Create(objectType As Type) As DBFormField
Return New DBFormField()
End Function
End Class
I suspect putting .ToString on the end of the JObject is not good enough for the DeserializeObject method? See comment above. But this code throws the error...
Cannot deserialize the current JSON object (e.g. {"name":"value"})
into type 'System.Collections.Generic.List`1[RSAP.DBFormField]'
because the type requires a JSON array (e.g. [1,2,3]) to deserialize
correctly.
I haven't tried serialising the JObject to a JSON string- this seems daft considering we have already parsed the JSON into a Jobject.
You've got single object in json and you try to deserialize it to list of objects - that can not be done.
Solutions:
You can wrap json object in array by adding [ and ] around object
You can deserialize to single object (not list):
JsonConvert.DeserializeObject<DBFormField>(someFormObj.form_fields.ToString(), new FormConverter());
You can deserialize single object and add it to list:
List<DBFormField> parsedFields = new List<DBFormField>();
parsedField = JsonConvert.DeserializeObject<DBFormField>someFormObj.form_fields.ToString(), new FormConverter());
parsedFields.Add(parsedField);

Categories