Web API not parsing get parameters correctly - c#

I have the following url
http://localhost/api/map/tmc/identify?
geometry={x:-112.0469856262207,y:33.3926093953406, spatialReference:{wkid:4326}}
&geometryType=esriGeometryPoint
&mapExtent={xmin:-112.18062400817871,ymin:33.33956359362892,xmax:-111.95076942443848,ymax:33.49201883920683, spatialReference:{wkid:4326}}
&tolerance=5
&sr=4326
&imageDisplay=1340,1065,96
&layers=all:0
&returnGeometry=true
&returnM=false
I am trying to intercept that object using the following action
public class SpatialReference
{
public int wkid { get; set; }
}
public class Geometry
{
public double x { get; set; }
public double y { get; set; }
public SpatialReference spatialReference { get; set; }
}
public class MapExtent
{
public double xmin { get; set; }
public double ymin { get; set; }
public double xmax { get; set; }
public double ymax { get; set; }
public SpatialReference spatialReference { get; set; }
}
public class RootObject
{
public Geometry geometry { get; set; }
public string geometryType { get; set; }
public MapExtent mapExtent { get; set; }
public int tolerance { get; set; }
public int sr { get; set; }
public List<int> imageDisplay { get; set; }
public string layers { get; set; }
public bool returnGeometry { get; set; }
public bool returnM { get; set; }
}
[HttpGet]
[Route("api/map/tmc/identify")]
public object Identify([FromUri]RootObject root)
{
return root;
}
And I get back
{
"geometry":{
"x":0.0,
"y":0.0,
"spatialReference":null
},
"geometryType":"esriGeometryPoint",
"mapExtent":{
"xmin":0.0,
"ymin":0.0,
"xmax":0.0,
"ymax":0.0,
"spatialReference":null
},
"tolerance":5,
"sr":4326,
"imageDisplay":[
0
],
"layers":"all:0",
"returnGeometry":true,
"returnM":false
}
as you can see the tolerance and sr were set correctly but the objects were not. Unfortunately I have no control over the request (It's always a GET and in this format). How can I correctly parse the url into the right objects

Since you have 9 query parameters in your http GET, you should declare 9 arguments in the action method instead of a root object i.e:
[HttpGet]
[Route("api/map/tmc/identify")]
public object Identify([FromUri]Geometry geometry,
[FromUri]string geometryType,
[FromUri] MapExtent mapExtent,
...)
[FromUri]RootObject root will not map the parameters correctly since they are query parameters and not a POST body

Related

Getting specific data from JSON Model

Here is my JSON model for trying to get info from Google Maps API. I am trying to get the "name" and "vicinity" from the "Result "class, but am having trouble with getting the data values from the IList, preferably i would like all the name and vicinity attributes to be returned as a string. Anyone got any ideas? Not familiar with using IList's on projects.
public record Location
{
public double lat { get; set; }
public double lng { get; set; }
}
public record Northeast
{
public double lat { get; set; }
public double lng { get; set; }
}
public record Southwest
{
public double lat { get; set; }
public double lng { get; set; }
}
public record Viewport
{
public Northeast northeast { get; set; }
public Southwest southwest { get; set; }
}
public record Geometry
{
public Location location { get; set; }
public Viewport viewport { get; set; }
}
public record OpeningHours
{
public bool? open_now { get; set; }
}
public record Photo
{
public int height { get; set; }
public IList<string> html_attributions { get; set; }
public string photo_reference { get; set; }
public int width { get; set; }
}
public record PlusCode
{
public string compound_code { get; set; }
public string global_code { get; set; }
}
public record Result
{
public string business_status { get; set; }
public Geometry geometry { get; set; }
public string icon { get; set; }
public string icon_background_color { get; set; }
public string icon_mask_base_uri { get; set; }
public string name { get; set; }
public OpeningHours opening_hours { get; set; }
public IList<Photo> photos { get; set; }
public string place_id { get; set; }
public PlusCode plus_code { get; set; }
public double rating { get; set; }
public string reference { get; set; }
public string scope { get; set; }
public IList<string> types { get; set; }
public int user_ratings_total { get; set; }
public string vicinity { get; set; }
}
public record ResourceData
{
public IList<object> html_attributions { get; set; }
public IList<Result> results { get; set; }
public string status { get; set; }
}
public record record_GooglePlacesAPI
{
public DateTime TimeCreated { get; set; } = DateTime.UtcNow;
public ResourceData resourceData { get; set; }
}
Try running a simple LINQ query on the data returned from google API like the following
//string holding google api response
string googleResponse = string.Empty;
var googleapi = JsonConvert.DeserializeObject<record_GooglePlacesAPI>(googleResponse);
//Linq query that returns list of names and vicinities
List<string> vicinities = googleapi.resourceData.results.Select(r => r.vicinity).ToList();
List<string> names = googleapi.resourceData.results.Select(r => r.name).ToList();
it should return you a list of strings holding names and viciniteis

Nested JSON failed to deserialize

This is the link for my nested JSON
: -
https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=-33.8670522,151.1957362&radius=1500&type=restaurant&keyword=cruise&key=AIzaSyDk8ZfHO__XrYfDGi9RnFA_WxlVmRW5HMI
i have generated a model class which has to give me the list of names , later i populate them in a RecyclerView.
using System;
using System.Collections.Generic;
namespace newApp.Model
{
public class Location
{
public double lat { get; set; }
public double lng { get; set; }
}
public class Northeast
{
public double lat { get; set; }
public double lng { get; set; }
}
public class Southwest
{
public double lat { get; set; }
public double lng { get; set; }
}
public class Viewport
{
public Northeast northeast { get; set; }
public Southwest southwest { get; set; }
}
public class Geometry
{
public Location location { get; set; }
public Viewport viewport { get; set; }
}
public class OpeningHours
{
public bool open_now { get; set; }
}
public class Photo
{
public int height { get; set; }
public List<string> html_attributions { get; set; }
public string photo_reference { get; set; }
public int width { get; set; }
}
public class PlusCode
{
public string compound_code { get; set; }
public string global_code { get; set; }
}
public class Result
{
public Geometry geometry { get; set; }
public string icon { get; set; }
public string id { get; set; }
public string name { get; set; }
public OpeningHours opening_hours { get; set; }
public List<Photo> photos { get; set; }
public string place_id { get; set; }
public PlusCode plus_code { get; set; }
public double rating { get; set; }
public string reference { get; set; }
public string scope { get; set; }
public List<string> types { get; set; }
public string vicinity { get; set; }
}
public class RootObject
{
public List<object> html_attributions { get; set; }
public List<Result> results { get; set; }
public string status { get; set; }
}
}
Then , in this method i tried to deserialize the data , i want to get a list of icon, name , id and location.
This is the method i initially have :
public async void getData()
{
var content = await _client.GetStringAsync(URL);
var n = JsonConvert.DeserializeObject<List<List<Result>>>(content);
Debug.WriteLine("Output ", n);
}
Try to deserialize to the RootObject class directly:
JsonConvert.DeserializeObject<RootObject>(content);
And then retrieve all data you need using LINQ.
Declare ResultHeadInfo class which will contain fields you need:
public class ResultHeadInfo
{
public Location Location { get; set; }
public string Name { get; set; }
public string Id { get; set; }
public string Icon { get; set; }
}
Then write LINQ query to get data:
var root = JsonConvert.DeserializeObject<RootObject>(content);
List<ResultHeadInfo> infoList = root.results.Select(x => new ResultHeadInfo {
Location = x.geometry.location,
Name = x.name,
Id = x.id,
Icon = x.icon
}).ToList();
By the way, you can use just Location object instead of Northest and Southwest as they are identical.
public class Viewport
{
public Location northeast { get; set; }
public Location southwest { get; set; }
}
In addition to the other answer, don't forget you can use attributes to identify the fields but keep the property names consistent with the usual naming conventions:
public partial class Viewport
{
[JsonProperty("northeast")]
public Location Northeast { get; set; }
[JsonProperty("southwest")]
public Location Southwest { get; set; }
}
I created those same classes recently for my project, and used quicktype.io to generate them. Much better output than the usual 'Paste Special' built into VS.

How to get data from JSON and convert into the object? [duplicate]

This question already has answers here:
Deserializing JSON data to C# using JSON.NET
(7 answers)
Closed 5 years ago.
I'm trying to receive data from request response which is JSON like this:
{
"cnt":1,
"list":[{
"coord":{
"lon":18.55,
"lat":50.11
},
"sys":{
"type":1,
"id":5356,
"message":0.0095,
"country":"PL",
"sunrise":1496630290,
"sunset":1496688673
},
"weather":[{
"id":800,
"main":"Clear",
"description":"clear sky",
"icon":"01d"
}],
"main":{
"temp":293.71,
"pressure":1014,
"humidity":42,
"temp_min":293.15,
"temp_max":294.15
},
"visibility":10000,
"wind":{
"speed":4.1,
"deg":60
},
"clouds":{
"all":0
},
"dt":1496686603,
"id":7531758,
"name":"Rybnik"
}]
}
I'm trying to use JSON.NET to deserialize JSON and receive data. But I don't know exactly how to do it properly.
I tried to achieve this by using my class method:
public Rootobject DeserializeJSON()
{
private JObject responseObject;
private JToken responseToken;
private JArray responseArray;
responseObject = JObject.Parse(json);
Rootobject Weather = new Rootobject();
responseArray = (JArray)responseObject.SelectToken("list");
responseToken = (JToken)responseArray.SelectToken("main");
Weather = responseToken.ToObject<Rootobject>();
return Weather;
}
But It doesn't seems to work. In this case, I tried to receive data from "main" property in JSON and convert in to my class object:
class Main
{
public float temp { get; set; }
public float pressure { get; set; }
public float humidity { get; set; }
public float temp_min { get; set; }
public float temp_max { get; set; }
}
Could you explain me, how it should works and where's my fault, please?
Initially, you need to declare the following classes:
public class Coord
{
[JsonProperty("lon")]
public double Lon { get; set; }
[JsonProperty("lat")]
public double Lat { get; set; }
}
public class Sys
{
[JsonProperty("type")]
public int Type { get; set; }
[JsonProperty("id")]
public int Id { get; set; }
[JsonProperty("message")]
public double Message { get; set; }
[JsonProperty("country")]
public string Country { get; set; }
[JsonProperty("sunrise")]
public int Sunrise { get; set; }
[JsonProperty("sunset")]
public int Sunset { get; set; }
}
public class Weather
{
[JsonProperty("id")]
public int Id { get; set; }
[JsonProperty("main")]
public string Main { get; set; }
[JsonProperty("description")]
public string Description { get; set; }
[JsonProperty("icon")]
public string Icon { get; set; }
}
public class Main
{
[JsonProperty("temp")]
public double Temp { get; set; }
[JsonProperty("pressure")]
public int Pressure { get; set; }
[JsonProperty("humidity")]
public int Humidity { get; set; }
[JsonProperty("temp_min")]
public double TempMin { get; set; }
[JsonProperty("temp_max")]
public double TempMax { get; set; }
}
public class Wind
{
[JsonProperty("speed")]
public double Speed { get; set; }
[JsonProperty("deg")]
public int Deg { get; set; }
}
public class Clouds
{
[JsonProperty("all")]
public int All { get; set; }
}
public class List
{
[JsonProperty("coord")]
public Coord Coord { get; set; }
[JsonProperty("sys")]
public Sys Sys { get; set; }
[JsonProperty("weather")]
public IList<Weather> Weather { get; set; }
[JsonProperty("main")]
public Main Main { get; set; }
[JsonProperty("visibility")]
public int Visibility { get; set; }
[JsonProperty("wind")]
public Wind Wind { get; set; }
[JsonProperty("clouds")]
public Clouds Clouds { get; set; }
[JsonProperty("dt")]
public int Dt { get; set; }
[JsonProperty("id")]
public int Id { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
}
public class Example
{
[JsonProperty("cnt")]
public int Cnt { get; set; }
[JsonProperty("list")]
public IList<List> List { get; set; }
}
Then you can deserialize your json as below:
var example = JsonConvert.DeserializeObject<Example>(jsonString)
where jsonString is your JSON.
PS. I derived the above classes using jsonutils and your json string.

Deserializing JSON data to C#

Could U help me Deserializing JSON to C#? I just eat my teeth on it.. =.=.
I find many methods how to do not solve this xD,
I dont want share that with U.
I wish to wait for your suggestions.
Usefull links:
http://jsonviewer.stack.hu/
http://json2csharp.com/
JSON looks..
[
{
"faceId":"626f5974-1d63-40d4-98f1-7e6a7df13dba",
"faceRectangle":{
"top":108,
"left":699,
"width":208,
"height":208
},
"faceAttributes":{
"smile":0.973,
"gender":"male",
"age":25.7,
"emotion":{
"anger":0.0,
"contempt":0.026,
"disgust":0.0,
"fear":0.0,
"happiness":0.973,
"neutral":0.001,
"sadness":0.0,
"surprise":0.0
}
}
},
{
"faceId":"bc051f1d-9a64-4e86-bf95-2af1de21d316",
"faceRectangle":{
"top":104,
"left":634,
"width":114,
"height":114
},
"faceAttributes":{
"smile":0.074,
"gender":"male",
"age":17.4,
"emotion":{
"anger":0.003,
"contempt":0.003,
"disgust":0.001,
"fear":0.002,
"happiness":0.074,
"neutral":0.828,
"sadness":0.079,
"surprise":0.01
}
}
}
]
First of all you need classes to which you want to deserialize, so you can create manually or the fastest and easiest way - you can copy json string that you have, then in visual studio
Edit -> Paste Special -> Paste JSON as Classes
Now you have structure for deserializing.Then you can for example use Newtonsoft.Json (which you can download from NuGet). There is JsonConvert.DeserializeObject<T>() generic method, that will do all deserialization work for you.
Also, if you want use your own property names in the class structure, you can use [JsonProperty("Name")] attribute, which will change the names of properties when they are serialized to JSON and vice versa.
Your JSON document represents an array so you must deserialize it to a collection
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
public class Program
{
public static void Main()
{
string jsonString = "[ {\"faceId\": \"626f5974-1d63-40d4-98f1-7e6a7df13dba\",\"faceRectangle\": { \"top\": 108, \"left\": 699, \"width\": 208, \"height\": 208 },\"faceAttributes\": { \"smile\": 0.973, \"gender\": \"male\", \"age\": 25.7, \"emotion\": { \"anger\": 0.0, \"contempt\": 0.026, \"disgust\": 0.0, \"fear\": 0.0, \"happiness\": 0.973, \"neutral\": 0.001, \"sadness\": 0.0, \"surprise\": 0.0 } }},{\"faceId\": \"bc051f1d-9a64-4e86-bf95-2af1de21d316\",\"faceRectangle\": { \"top\": 104, \"left\": 634, \"width\": 114, \"height\": 114 },\"faceAttributes\": { \"smile\": 0.074, \"gender\": \"male\", \"age\": 17.4, \"emotion\": { \"anger\": 0.003, \"contempt\": 0.003, \"disgust\": 0.001, \"fear\": 0.002, \"happiness\": 0.074, \"neutral\": 0.828, \"sadness\": 0.079, \"surprise\": 0.01 } }}]";
var result = JsonConvert.DeserializeObject<IList<RootObject>>(jsonString);
foreach ( var item in result )
Console.WriteLine( item.faceId );
}
}
// Generated by http://json2csharp.com
public class FaceRectangle
{
public int top { get; set; }
public int left { get; set; }
public int width { get; set; }
public int height { get; set; }
}
public class Emotion
{
public double anger { get; set; }
public double contempt { get; set; }
public double disgust { get; set; }
public double fear { get; set; }
public double happiness { get; set; }
public double neutral { get; set; }
public double sadness { get; set; }
public double surprise { get; set; }
}
public class FaceAttributes
{
public double smile { get; set; }
public string gender { get; set; }
public double age { get; set; }
public Emotion emotion { get; set; }
}
public class RootObject
{
public string faceId { get; set; }
public FaceRectangle faceRectangle { get; set; }
public FaceAttributes faceAttributes { get; set; }
}
.net fiddle
If you want c# object from that JSON, this is how it is done:
public class FaceRectangle
{
public int top { get; set; }
public int left { get; set; }
public int width { get; set; }
public int height { get; set; }
}
public class Emotion
{
public double anger { get; set; }
public double contempt { get; set; }
public double disgust { get; set; }
public double fear { get; set; }
public double happiness { get; set; }
public double neutral { get; set; }
public double sadness { get; set; }
public double surprise { get; set; }
}
public class FaceAttributes
{
public double smile { get; set; }
public string gender { get; set; }
public double age { get; set; }
public Emotion emotion { get; set; }
}
public class RootObject
{
public string faceId { get; set; }
public FaceRectangle faceRectangle { get; set; }
public FaceAttributes faceAttributes { get; set; }
}
var obj = JsonConvert.DeserializeObject<RootObject>(json);
Instead of giving you a C# class that maps to the JSON which you'll just copy blindly, I'll recommend that you generate such a class yourself.
Make sure you're running Visual Studio 2013 SP2 or higher.
Get a JSON document for your data. If it has optional fields, make sure the one you have is as full as possible.
In a new CS file in VS, choose Edit -> Paste Special -> Paste JSON as Classes.
This will create a C# class that corresponds to the JSON data. Now, you can use JSON.NET's JsonConvert.DeserializeObject() to create it
By using NewtonsoftJson library to parse data easily
Example
dynamic x = Newtonsoft.Json.JsonConvert.DeserializeObject(Jsondata); //to parse data
foreach (var product in x) {
Messagebox.show(product.data.ToString());
}
You can convert Json to c# Class
public class FaceRectangle
{
public int top { get; set; }
public int left { get; set; }
public int width { get; set; }
public int height { get; set; }
}
public class Emotion
{
public double anger { get; set; }
public double contempt { get; set; }
public double disgust { get; set; }
public double fear { get; set; }
public double happiness { get; set; }
public double neutral { get; set; }
public double sadness { get; set; }
public double surprise { get; set; }
}
public class FaceAttributes
{
public double smile { get; set; }
public string gender { get; set; }
public double age { get; set; }
public Emotion emotion { get; set; }
}
public class Example
{
public string faceId { get; set; }
public FaceRectangle faceRectangle { get; set; }
public FaceAttributes faceAttributes { get; set; }
}
Example Example_class =
Newtonsoft.Json.JsonConvert.DeserializeObject<Example>(json.ToString());
Please see this useful link Json to C# Class https://jsonutils.com/
Do you mean something like this? To deserialize to an object?
using System.Web.Script.Serialization;
public class FaceRectangle
{
public int top { get; set; }
public int left { get; set; }
public int width { get; set; }
public int height { get; set; }
}
public class Emotion
{
public double anger { get; set; }
public double contempt { get; set; }
public double disgust { get; set; }
public double fear { get; set; }
public double happiness { get; set; }
public double neutral { get; set; }
public double sadness { get; set; }
public double surprise { get; set; }
}
public class FaceAttributes
{
public double smile { get; set; }
public string gender { get; set; }
public double age { get; set; }
public Emotion emotion { get; set; }
}
public class RootObject
{
public string faceId { get; set; }
public FaceRectangle faceRectangle { get; set; }
public FaceAttributes faceAttributes { get; set; }
}
return JsonConvert.DeserializeObject<RootObject>(jsonString);
I hope this will work
string Jsondata = "Your Json data";
public class Mainclass
{
public guid faceId;
IEnumerable<faceRectangle>
IEnumerable<faceAttributes>
}
public class faceRectangle
{
}
public class faceAttributes
{
}
Mainclass backdata = JsonConvert.DeserializeObject<Mainclass>(Jsondata , new DataConverter())

json feed as a datasource in SSIS

I am trying to deserialize a json feed from openweathermap.org api. After a lot of tries all, using script transformation task, I get is errors and even different ones. Based on the below classes generated by JSON, how I should write the for each statements (as class Weather and Main are part of class RootObject)?
I can get even XML data from api, instead of JSON. Would it be easier to implement the process?
I am not asking for the answer, just a push to start.
JSON:
{
"coord":{
"lon":-122.08,
"lat":37.39
},
"weather":[
{
"id":741,
"main":"Fog",
"description":"fog",
"icon":"50n"
}
],
"base":"stations",
"main":{
"temp":286.14,
"pressure":1022,
"humidity":82,
"temp_min":285.15,
"temp_max":287.15
},
"visibility":16093,
"wind":{
"speed":1.11,
"deg":13.5055
},
"clouds":{
"all":1
},
"dt":1479110160,
"sys":{
"type":1,
"id":397,
"message":0.1452,
"country":"US",
"sunrise":1479134859,
"sunset":1479171466
},
"id":5375480,
"name":"Mountain View",
"cod":200
}
Class:
public class Coord
{
public double lon { get; set; }
public double lat { get; set; }
}
public class Weather
{
public int id { get; set; }
public string main { get; set; }
public string description { get; set; }
public string icon { get; set; }
}
public class Main
{
public double temp { get; set; }
public int pressure { get; set; }
public int humidity { get; set; }
public double temp_min { get; set; }
public double temp_max { get; set; }
}
public class Wind
{
public double speed { get; set; }
public double deg { get; set; }
}
public class Clouds
{
public int all { get; set; }
}
public class Sys
{
public int type { get; set; }
public int id { get; set; }
public double message { get; set; }
public string country { get; set; }
public int sunrise { get; set; }
public int sunset { get; set; }
}
public class RootObject
{
public Coord coord { get; set; }
public List<Weather> weather { get; set; }
public string #base { get; set; }
public Main main { get; set; }
public int visibility { get; set; }
public Wind wind { get; set; }
public Clouds clouds { get; set; }
public int dt { get; set; }
public Sys sys { get; set; }
public int id { get; set; }
public string name { get; set; }
public int cod { get; set; }
}

Categories

Resources