Problem with parsing JavaScript objects to C# - c#

I'm parsing js file containing object values to C# objects. For now - I've converted JS code to JSON and then tried to convert to C# object.
I'm having problem with coming up to idea of how to generate objects in C#. I've tried doing multiple various tries, mostly with Dictionaries (Dictionary<string,[object]). I Googled, visited SO in multiple questions, no success for now - all my ideas resulted in null object.
Important note - I can't change the source of JS, can change anything after that.
Latest objects idea:
public class SingleFarm
{
public List<string> Modules { get; set; }
public List<string> Servers { get; set; }
}
public class SingleEnv
{
public Dictionary<string, SingleFarm> Farms { get; set; }
}
public class FarmsModel
{
public Dictionary<string, SingleEnv> FarmsModel { get; set; }
}
Parsing code:
var farmsText = File.ReadAllText(filePath);
//using Jurassic
var engine = new ScriptEngine();
var result = engine.Evaluate(farmsText);
var json = JSONObject.Stringify(engine, result);
var parsed = JsonConvert.DeserializeObject<FarmsModel>(json);
JS file source:
var environments = {};
environments['ENV1'] = {
"WWW": {
"Modules": [
"module21"
],
"Servers": [
"a-1"
]
}
};
environments['ENV2'] = {
"FARM1": {
"Modules": [
"module41"
],
"Servers": [
"s1",
"s2"
]
},
"FARM2": {
"Modules": [
"module11"
],
"Servers": [
""
]
},
"FARM3": {
"Modules": [
"module1"
],
"Servers": [
""
]
}
};
environments['ENV3'] = {
"FARM1": {
"Modules": [
"module10"
],
"Servers": [
"server1"
]
},
"FARM2": {
"Modules": [
"module22"
],
"Servers": [
""
]
},
"FARM3": {
"Modules": [
"module33"
],
"Servers": [
"server3"
]
}
};
JSON looks as follows:
{
"ENV1": {
"WWW": {
"Modules": [
"module21"
],
"Servers": [
"a-1"
]
}
},
"ENV2": {
"FARM1": {
"Modules": [
"module41"
],
"Servers": [
"s1",
"s2"
]
},
"FARM2": {
"Modules": [
"module11"
],
"Servers": [
""
]
},
"FARM3": {
"Modules": [
"module1"
],
"Servers": [
""
]
}
},
"ENV3": {
"FARM1": {
"Modules": [
"module10"
],
"Servers": [
"server1"
]
},
"FARM2": {
"Modules": [
"module22"
],
"Servers": [
""
]
},
"FARM3": {
"Modules": [
"module33"
],
"Servers": [
"server3"
]
}
}
}
Do you have any ideas?

You shouldn't be trying to serialize dictionaries to objects since it will try to map the property names.
If you use
var parsed = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, SingleFarm>>>(json);
It should work. Fiddle

Related

Multiple conditions in MongoDB group aggregation

I have the documents in the below format. I would like to count production deployments from the collection. Mongo Playground link is also attached here.
A document is considered as a production deployment when ANY of the following is true.
deployments.steps.environments.name contains Production OR Prod OR Prd
deployments.steps.stages contains Production OR Prod OR Prd
Any help on incorporating the above condition into the query to calculate TotalCount, SucceededCount etc. please?
Update: I have updated the query here. Am I right?
[
{
"productId": "613a5114b24382575e7e7668",
"deployments": [
{
"projectId": "613a5083b24382575e7e765f",
"title": "Release-4",
"steps": [
{
"releaseId": 8168,
"title": "UnitTest-Release-004",
"environments": [
{
"envId": 61553,
"name": "Production"
}
],
"stages": []
},
{
"releaseId": 7376,
"title": "UnitTest-Release-005",
"environments": [],
"stages": [
"Prod"
]
}
]
}
],
"createdAt": ISODate("2021-11-03T07:55:57.486Z"),
"deploymentStatus": "Succeeded",
"completedAt": ISODate("2021-11-03T07:29:00.907Z"),
"startedAt": ISODate("2021-11-03T07:26:53.761Z"),
},
{
"productId": "613a5114b24382575e7e7668",
"deployments": [
{
"projectId": "613a5083b24382575e7e765f",
"title": "Release-4",
"steps": [
{
"releaseId": 8168,
"title": "UnitTest-Release-004",
"environments": [
{
"envId": 61553,
"name": "Production"
}
],
"stages": []
},
{
"releaseId": 7376,
"title": "UnitTest-Release-005",
"environments": [],
"stages": []
}
]
}
],
"createdAt": ISODate("2021-11-03T07:55:57.486Z"),
"deploymentStatus": "Failed",
"completedAt": ISODate("2021-11-03T07:29:00.907Z"),
"startedAt": ISODate("2021-11-03T07:26:53.761Z"),
}
]
Here is the query.
db.collection.aggregate([
{
$match: {
$and: [
{
"createdAt": {
$gte: ISODate("2020-11-01")
}
},
{
"createdAt": {
$lte: ISODate("2021-11-17")
}
}
],
$or: [
{
"deployments.steps.environments.name": {
"$in": [
"Prd",
"Prod",
"Production"
]
}
},
{
"deployments.steps.stages.name": {
"$in": [
"Prd",
"Prod",
"Production"
]
}
}
]
}
},
{
$group: {
_id: "$productId",
TotalCount: {
$sum: 1
},
SucceededCount: {
$sum: {
"$cond": {
"if": {
$eq: [
"$deploymentStatus",
"Succeeded"
]
},
"then": 1,
"else": 0
}
}
},
FailedCount: {
$sum: {
"$cond": {
"if": {
$eq: [
"$deploymentStatus",
"Failed"
]
},
"then": 1,
"else": 0
}
}
},
CancelledCount: {
$sum: {
"$cond": {
"if": {
$eq: [
"$deploymentStatus",
"Cancelled"
]
},
"then": 1,
"else": 0
}
}
},
NotStartedCount: {
$sum: {
"$cond": {
"if": {
$eq: [
"$deploymentStatus",
"NotStarted"
]
},
"then": 1,
"else": 0
}
}
}
}
}
])
MongoPlayground
$cond - if - then - else = without quotes

Performing an update on objects from an array by using object own values

Having a collection sampled by next:
{
"_id": {
"$oid": "6139b08ee5a3119445892f94"
},
"type": "bike",
"specs": [
{
"name": "giant",
"models": [
{
"name": "v1",
"categories": [
{
"name": "v11",
"price": 0
},
{
"name": "v12",
"price": 0.1
},
{
"name": "v13",
"price": 0.1
}
]
},
{
"name": "v2",
"categories": [
{
"name": "v21",
"price": 1
},
{
"name": "v22",
"price": 0.1
}
]
}
]
},
{
"name": "sputnik",
"models": [
{
"name": "s1",
"categories": [
{
"name": "s11",
"price": 20
},
{
"name": "s12",
"price": 0.9
},
{
"name": "s13",
"price": 1.1
}
]
},
{
"name": "s2",
"categories": [
{
"name": "s31",
"price": 1
},
{
"name": "s32",
"price": 0.1
}
]
}
]
}
]
}
In order to edit models items by adding a new subdocument with next structure:
"valid": {
"isValid": true,
"currentName": [value from name field]
}
and remove field name
Almost achieved that by using Aggregations:
var dineInOptionsDefinition =
BsonDocument.Parse("{ isValid: 5, currentName: '$specs.name'}");
var addNewFieldsDefinition = new BsonDocument
{
{ "$addFields", new BsonDocument
{
{
"specs.models.valid", dineInOptionsDefinition
}
}
}
};
var t1 = collection
.Aggregate()
.Match(filterDefinition)
.AppendStage<BsonDocument>(addNewFieldsDefinition)
.Merge(collection);
The problem I'm facing is the value for currentName - as result it's an array of concatenated name fields values. Any clue how to get the value from the current document field value?

Filtering Nested array with linq

I have an array like this coming from API response and I want to filter by nested property products to returns product with only id 11
"assets": [
{
"name": "abc",
"products": [
{
"id": "11",
"status": true
},
{
"id": "14",
"status": null
}
]
},
{
"name": "xyz",
"products": [
{
"id": "11",
"status": true
},
{
"id": "28",
"status": null
}
]
},
{
"name": "123",
"products": [
{
"id": "48",
"status": null
}
]
},
{
"name": "456",
"products": [
{
"id": "11",
"status": true
}
]
}
]
the resulting output should look like this,
"assets": [
{
"name": "abc",
"products": [
{
"id": "11",
"status": true
}
]
},
{
"name": "xyz",
"products": [
{
"id": "11",
"status": true
}
]
},
{
"name": "123",
"products": []
},
{
"name": "456",
"products": [
{
"id": "11",
"status": true
}
]
}
]
I'm trying to return filter output with the C# LINQ method. but, getting an error when filtering a nested array with the following method
"Cannot convert lambda expression to intended delegate type because some of the return types in the block are not implicitly convertible to the delegate return type"
assets.Select(asset => asset.products.Where(product => product.id == "11")).ToArray();
You can just remove all items from every products array, whose id doesn't equal 11. Parse JSON to JObject, iterate over assets array, find products with id different from 11 and remove them form original array
var json = JObject.Parse(jsonString);
foreach (var asset in json["assets"])
{
var productsArray = asset["products"] as JArray;
if (productsArray == null)
continue;
var productsToRemove = productsArray
.Where(o => o?["id"]?.Value<int>() != 11)
.ToList();
foreach (var product in productsToRemove)
productsArray.Remove(product);
}
Console.WriteLine(json);
Instead of Select and Applying a, Where try to remove the Products that you do not want.
Following is a sample code.
class Program
{
static void Main(string[] args)
{
var json = #"
{
'assets': [
{
'name': 'abc',
'products': [
{
'id': '11',
'status': true
},
{
'id': '14',
'status': null
}
]
},
{
'name': 'xyz',
'products': [
{
'id': '11',
'status': true
},
{
'id': '28',
'status': null
}
]
},
{
'name': '123',
'products': [
{
'id': '48',
'status': null
}
]
},
{
'name': '456',
'products': [
{
'id': '11',
'status': true
}
]
}
]}";
var root = JsonConvert.DeserializeObject<Root>(json);
var assets = root.Assets;
assets.ForEach(a =>
{
a.Products.RemoveAll(p => p.Id != 11);
});
}
}
public partial class Root
{
[JsonProperty("assets")]
public List<Asset> Assets { get; set; }
}
public partial class Asset
{
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("products")]
public List<Product> Products { get; set; }
}
public partial class Product
{
[JsonProperty("id")]
public long Id { get; set; }
[JsonProperty("status")]
public bool? Status { get; set; }
}
To filter the list, you will need to create a new list with products whose ID == YourId. Following linq query does the necessary steps to create the list you want.
Filter out any assets that dont have any product with ID == 11. This is necessary to skip nulls in the new list that will be generated (Where statement)
Create a collection / list of new assets that only have the products whose ID == 11 (Select statement)
var list = assets.Where(x => x.Products.Where(y => y.Id.Equals("11")).Count() > 0)
.Select(asset => {
return new Asset() {
Name = asset.Name,
Products = asset.Products.Where(x => x.Id == "11").ToList()
};
}).ToList();
// Create the RootObject that holds a list of all the arrays if you want.
Rootobject newAssetCollection = new Rootobject() { Assets = list };
Below is the Json that was printed
Console.WriteLine(JsonConvert.SerializeObject(newAssetCollection, Formatting.Indented));
{
"assets": [
{
"name": "abc",
"products": [
{
"id": "11",
"status": true
}
]
},
{
"name": "xyz",
"products": [
{
"id": "11",
"status": true
}
]
},
{
"name": "456",
"products": [
{
"id": "11",
"status": true
}
]
}
]
}

Deserializing Import Io JSON with multiple objects

Morning all,
Im using Newtonsoft.JSON to deserialize a JSON response from Import Io. I have successfully used http://json2csharp.com/ to build a data model successfully in one instance to gain access to the data, however in that instance only one JSON object was returned. I am now working on a new piece of JSON that is being returned with multiple objects and i'm hitting issues with the following error message:
Newtonsoft.Json.JsonSerializationException: Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[OSP.Shop_DTO+RootObject]' 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) 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 'url', line 1, position 7."
My JSON looks like this:
{
"url": "http://www.myurl.com/-shop-item.html",
"result": {
"extractorData": {
"url": "http://www.myurl.com/-shop-item.html",
"resourceId": "1db49f66afc2f234cb5ab470f0c39e0c",
"data": [
{
"group": [
{
"BN_shop_1KG": [
{
"text": "$36.00"
}
],
"BN_shop_2KG": [
{
"text": "$69"
}
],
"BN_shop_3KG": [
{
"text": "$97"
}
],
"BN_VEGE_5KG": [
{
"text": "3 KG = $97"
}
],
"BN_shop_4KG": [
{
"text": "$124"
}
],
"BN_shop_5KG": [
{
"text": "$149"
}
]
}
]
}
]
},
"pageData": {
"resourceId": "1db49f66afc2f234cb5ab470f0c39e0c",
"statusCode": 200,
"timestamp": 1476432605275
},
"timestamp": 1476432606594,
"sequenceNumber": 0
}
}{
"url": "http://www.myurl.com/-shop-concentrate.html",
"result": {
"extractorData": {
"url": "http://www.myurl.com/-shop-concentrate.html",
"resourceId": "dd4837cc7d0085eae005243c7bd8ca8a",
"data": [
{
"group": [
{
"BN_shop_1KG": [
{
"text": "$27.00"
}
],
"BN_shop_2KG": [
{
"text": "$49"
}
],
"BN_shop_3KG": [
{
"text": "$69"
}
],
"BN_VEGE_5KG": [
{
"text": "3 KG = $69"
}
],
"BN_shop_4KG": [
{
"text": "$84"
}
],
"BN_shop_5KG": [
{
"text": "$99"
}
]
}
]
}
]
},
"pageData": {
"resourceId": "dd4837cc7d0085eae005243c7bd8ca8a",
"statusCode": 200,
"timestamp": 1476432604237
},
"timestamp": 1476432605124,
"sequenceNumber": 1
}
}{
"url": "http://www.myurl.comshop-matrix.html",
"result": {
"extractorData": {
"url": "http://www.myurl.comshop-matrix.html",
"resourceId": "deee30ffa0098e017a06c0e0c805e133",
"data": [
{
"group": [
{
"BN_shop_1KG": [
{
"text": "$29.00"
}
],
"BN_shop_2KG": [
{
"text": "$56"
}
],
"BN_shop_3KG": [
{
"text": "$79"
}
],
"BN_VEGE_5KG": [
{
"text": "3 KG = $79"
}
],
"BN_shop_4KG": [
{
"text": "$99"
}
],
"BN_shop_5KG": [
{
"text": "$119"
}
]
}
]
}
]
},
"pageData": {
"resourceId": "deee30ffa0098e017a06c0e0c805e133",
"statusCode": 200,
"timestamp": 1476432602408
},
"timestamp": 1476432603204,
"sequenceNumber": 2
}
}{
"url": "http://www.myurl.comsoy-shop-item.html",
"result": {
"extractorData": {
"url": "http://www.myurl.comsoy-shop-item.html",
"resourceId": "5593aad40f95ba868626e47a1b550813",
"data": [
{
"group": [
{
"BN_shop_1KG": [
{
"text": "$25.00"
}
],
"BN_shop_2KG": [
{
"text": "$45"
}
],
"BN_shop_3KG": [
{
"text": "$89"
}
],
"BN_VEGE_5KG": [
{
"text": "5 KG = $89"
}
],
"BN_shop_4KG": [
{
"text": "$175"
}
],
"BN_shop_5KG": [
{
"text": "$339"
}
]
}
]
}
]
},
"pageData": {
"resourceId": "5593aad40f95ba868626e47a1b550813",
"statusCode": 200,
"timestamp": 1476432602479
},
"timestamp": 1476432603847,
"sequenceNumber": 3
}
}{
"url": "http://www.myurl.compea-shop.html",
"result": {
"extractorData": {
"url": "http://www.myurl.compea-shop.html",
"resourceId": "f91e05d0265ab5a5f7f948c57a05bced",
"data": [
{
"group": [
{
"BN_shop_1KG": [
{
"text": "$25.00"
}
],
"BN_shop_2KG": [
{
"text": "$45"
}
],
"BN_shop_3KG": [
{
"text": "$89"
}
],
"BN_VEGE_5KG": [
{
"text": "5 KG = $89"
}
],
"BN_shop_4KG": [
{
"text": "$169"
}
],
"BN_shop_5KG": [
{
"text": "$319"
}
]
}
]
}
]
},
"pageData": {
"resourceId": "f91e05d0265ab5a5f7f948c57a05bced",
"statusCode": 200,
"timestamp": 1476432605227
},
"timestamp": 1476432606451,
"sequenceNumber": 4
}
}
Model looks like this:
public class BNShop1KG
{
public string text { get; set; }
}
public class BNShop2KG
{
public string text { get; set; }
}
public class BNShop3KG
{
public string text { get; set; }
}
public class BNVEGE5KG
{
public string text { get; set; }
}
public class BNShop4KG
{
public string text { get; set; }
}
public class BNShop5KG
{
public string text { get; set; }
}
public class Group
{
public List<BNShop1KG> BN_shop_1KG { get; set; }
public List<BNShop2KG> BN_shop_2KG { get; set; }
public List<BNShop3KG> BN_shop_3KG { get; set; }
public List<BNVEGE5KG> BN_VEGE_5KG { get; set; }
public List<BNShop4KG> BN_shop_4KG { get; set; }
public List<BNShop5KG> BN_shop_5KG { get; set; }
}
public class Datum
{
public List<Group> group { get; set; }
}
public class ExtractorData
{
public string url { get; set; }
public string resourceId { get; set; }
public List<Datum> data { get; set; }
}
public class PageData
{
public string resourceId { get; set; }
public int statusCode { get; set; }
public long timestamp { get; set; }
}
public class Result
{
public ExtractorData extractorData { get; set; }
public PageData pageData { get; set; }
public long timestamp { get; set; }
public int sequenceNumber { get; set; }
}
public class RootObject
{
public string url { get; set; }
public Result result { get; set; }
}
In my code i'm trying to get access to the 'text' value in 'BN_shop_1KG' from the first JSON object. This item:
"BN_shop_1KG": [
{
"text": "$36.00"
}
I've tried the following in my code, but am receiving the error outlined above. From what I understand reading some previous threads about this is that I will need to use a deserialize into List to handle JSON received in this manner:
List<Shop_DTO.RootObject> obj = JsonConvert.DeserializeObject<List<Shop_DTO.RootObject>>(_rawHtmlResult);
var price = obj.First().result.extractorData.data[0].group[0].BN_shop_1kg[0].text;
Debug.WriteLine("Price for item {0}", price);
Any help would be hugely appreciated, i've been stuck on this for a couple of days :(
The Json file is invalid. Since it contains multiple Json object, it should be a Json array which needs to be wrapped by [], and another thing is between each Json object, you need ","
var jsonText = #"[{
""url"": ""http://www.myurl.com/-shop-item.html"",
""result"": {
""extractorData"": {
""url"": ""http://www.myurl.com/-shop-item.html"",
""resourceId"": ""1db49f66afc2f234cb5ab470f0c39e0c"",
""data"": [
{
""group"": [
{
""BN_shop_1KG"": [
{
""text"": ""$36.00""
}
],
""BN_shop_2KG"": [
{
""text"": ""$69""
}
],
""BN_shop_3KG"": [
{
""text"": ""$97""
}
],
""BN_VEGE_5KG"": [
{
""text"": ""3 KG = $97""
}
],
""BN_shop_4KG"": [
{
""text"": ""$124""
}
],
""BN_shop_5KG"": [
{
""text"": ""$149""
}
]
}
]
}
]
},
""pageData"": {
""resourceId"": ""1db49f66afc2f234cb5ab470f0c39e0c"",
""statusCode"": 200,
""timestamp"": 1476432605275
},
""timestamp"": 1476432606594,
""sequenceNumber"": 0
}
},{
""url"": ""http://www.myurl.com/-shop-concentrate.html"",
""result"": {
""extractorData"": {
""url"": ""http://www.myurl.com/-shop-concentrate.html"",
""resourceId"": ""dd4837cc7d0085eae005243c7bd8ca8a"",
""data"": [
{
""group"": [
{
""BN_shop_1KG"": [
{
""text"": ""$27.00""
}
],
""BN_shop_2KG"": [
{
""text"": ""$49""
}
],
""BN_shop_3KG"": [
{
""text"": ""$69""
}
],
""BN_VEGE_5KG"": [
{
""text"": ""3 KG = $69""
}
],
""BN_shop_4KG"": [
{
""text"": ""$84""
}
],
""BN_shop_5KG"": [
{
""text"": ""$99""
}
]
}
]
}
]
},
""pageData"": {
""resourceId"": ""dd4837cc7d0085eae005243c7bd8ca8a"",
""statusCode"": 200,
""timestamp"": 1476432604237
},
""timestamp"": 1476432605124,
""sequenceNumber"": 1
}
},{
""url"": ""http://www.myurl.comshop-matrix.html"",
""result"": {
""extractorData"": {
""url"": ""http://www.myurl.comshop-matrix.html"",
""resourceId"": ""deee30ffa0098e017a06c0e0c805e133"",
""data"": [
{
""group"": [
{
""BN_shop_1KG"": [
{
""text"": ""$29.00""
}
],
""BN_shop_2KG"": [
{
""text"": ""$56""
}
],
""BN_shop_3KG"": [
{
""text"": ""$79""
}
],
""BN_VEGE_5KG"": [
{
""text"": ""3 KG = $79""
}
],
""BN_shop_4KG"": [
{
""text"": ""$99""
}
],
""BN_shop_5KG"": [
{
""text"": ""$119""
}
]
}
]
}
]
},
""pageData"": {
""resourceId"": ""deee30ffa0098e017a06c0e0c805e133"",
""statusCode"": 200,
""timestamp"": 1476432602408
},
""timestamp"": 1476432603204,
""sequenceNumber"": 2
}
},{
""url"": ""http://www.myurl.comsoy-shop-item.html"",
""result"": {
""extractorData"": {
""url"": ""http://www.myurl.comsoy-shop-item.html"",
""resourceId"": ""5593aad40f95ba868626e47a1b550813"",
""data"": [
{
""group"": [
{
""BN_shop_1KG"": [
{
""text"": ""$25.00""
}
],
""BN_shop_2KG"": [
{
""text"": ""$45""
}
],
""BN_shop_3KG"": [
{
""text"": ""$89""
}
],
""BN_VEGE_5KG"": [
{
""text"": ""5 KG = $89""
}
],
""BN_shop_4KG"": [
{
""text"": ""$175""
}
],
""BN_shop_5KG"": [
{
""text"": ""$339""
}
]
}
]
}
]
},
""pageData"": {
""resourceId"": ""5593aad40f95ba868626e47a1b550813"",
""statusCode"": 200,
""timestamp"": 1476432602479
},
""timestamp"": 1476432603847,
""sequenceNumber"": 3
}
},{
""url"": ""http://www.myurl.compea-shop.html"",
""result"": {
""extractorData"": {
""url"": ""http://www.myurl.compea-shop.html"",
""resourceId"": ""f91e05d0265ab5a5f7f948c57a05bced"",
""data"": [
{
""group"": [
{
""BN_shop_1KG"": [
{
""text"": ""$25.00""
}
],
""BN_shop_2KG"": [
{
""text"": ""$45""
}
],
""BN_shop_3KG"": [
{
""text"": ""$89""
}
],
""BN_VEGE_5KG"": [
{
""text"": ""5 KG = $89""
}
],
""BN_shop_4KG"": [
{
""text"": ""$169""
}
],
""BN_shop_5KG"": [
{
""text"": ""$319""
}
]
}
]
}
]
},
""pageData"": {
""resourceId"": ""f91e05d0265ab5a5f7f948c57a05bced"",
""statusCode"": 200,
""timestamp"": 1476432605227
},
""timestamp"": 1476432606451,
""sequenceNumber"": 4
}
}]"
Then you can use your code to get the price. Btw, there is a typo in your code, BN_shop_1kg is supposed to be BN_shop_1KG

How can I deserialize nested JSON arrays?

I am trying to deserialize GeoJson so I can break it up and store it in a Db. When I try to deserialize it, the deserialization of coordinates is failing.
I'm using the following class for a geometry:
public class GeoJsonGeometry {
public string type { get; set; }
public string[, ,] coordinates { get; set; }
}
"geometry": { "type": "Polygon", "coordinates": [ [ [ -85.388717, 33.913044 ], [ -85.380885, 33.873508 ], [ -85.379455, 33.866291 ], [ -85.377426, 33.856047 ], [ -85.376403, 33.850656 ], [ -85.364595, 33.788446 ], [ -85.361844, 33.773951 ], [ -85.360491, 33.767958 ], [ -85.357402, 33.750104 ], [ -85.355252, 33.739245 ], [ -85.344054, 33.682684 ], [ -85.342722, 33.675953 ], [ -85.323792, 33.580339 ], [ -85.315340, 33.537646 ], [ -85.314994, 33.535898 ], [ -85.314843, 33.534951 ], [ -85.314091, 33.530218 ], [ -85.313999, 33.529807 ], [ -85.304439, 33.482884 ], [ -85.308211, 33.481579 ], [ -85.309250, 33.483137 ], [ -85.314852, 33.487603 ],...]]]
I've tried double [,,] but it didn't work either.
I'm confused as this looks like it should serialize nicely as it's nested arrays, but it's not. Any help would be appreciated.
I've also tried List<List<List<double>>> and double[][][] and it always fails.
Your Geometry object should be
public class Geometry
{
public string type { get; set; }
public List<List<List<double>>> coordinates { get; set; }
}
EDIT
var obj = JsonConvert.DeserializeObject<RootObject>(json);
public class Geometry
{
public string type { get; set; }
public List<List<List<double>>> coordinates { get; set; }
}
public class RootObject
{
public Geometry geometry { get; set; }
}
json:
{
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
-85.388717,
33.913044
],
[
-85.380885,
33.873508
],
[
-85.379455,
33.866291
],
[
-85.377426,
33.856047
],
[
-85.376403,
33.850656
],
[
-85.364595,
33.788446
],
[
-85.361844,
33.773951
],
[
-85.360491,
33.767958
],
[
-85.357402,
33.750104
],
[
-85.355252,
33.739245
],
[
-85.344054,
33.682684
],
[
-85.342722,
33.675953
],
[
-85.323792,
33.580339
],
[
-85.31534,
33.537646
],
[
-85.314994,
33.535898
],
[
-85.314843,
33.534951
],
[
-85.314091,
33.530218
],
[
-85.313999,
33.529807
],
[
-85.304439,
33.482884
],
[
-85.308211,
33.481579
],
[
-85.30925,
33.483137
],
[
-85.314852,
33.487603
]
]
]
}
}
JSON does not support multi-dimensional arrrays.
That's an array of arrays of arrays: double[][][].

Categories