C# Manipulating JSON data

c#, json, json.net

Solution

dynamic contourManifest = JObject.Parse(input);
foreach (var feature in contourManifest.features)
{
    feature.geometry.Replace(
            JObject.FromObject(
                        new { 
                            type = "Point", 
                            coordinates = feature.geometry.coordinates[0][0] 
                        }));
}

var newJson = contourManifest.ToString();

Problem

I have a 'simple' scenario: Read some JSON file, Filter or change some of the values and write the resulting json back without changing the original formatting. So for example to change this: ``` { "type": "FeatureCollection", "crs": { "type": "EPSG", "properties": { "code": 28992 } }, "features": [ { "type": "Feature", "geometry": { "type": "Polygon", "coordinates": [ [ [ 149886.192, 374554.705 ], [ 149728.583, 374473.112 ], [ 149725.476, 374478.215 ] ] ] } } ] } ``` Into this: ``` { "type": "FeatureCollection", "crs": { "type": "EPSG", "properties": { "code": 28992 } }, "features": [ { "type": "Feature", "geometry": { "type": "Point", "coordinates": [ 149886.192, 374554.705 ] } } ] } ``` I've tried JSON.Net by newtonsoft among others but the only this I can find is: - read into object - write object to json But I'm missing the 'change the object' step. Any hints? Update Here's what I've tried so far: ``` JToken contourManifest = JObject.Parse(input); JToken features = contourManifest.SelectToken("features"); for (int i = 0; i < features.Count(); i++) { JToken geometry = features[i].SelectToken("geometry"); JToken geoType = geometry.SelectToken("type"); JToken coordinates = geometry.SelectToken("coordinates"); geoType = "Point"; } ``` But this only changes the value of the geoType variable. I'd expected to change the value inside the geometry as well. I need a reference, not a copy! Is this possible? Update I am currently off this project but I'd like to give my feedback to the answerers. Though I like the simplicity of Shahin, I like the more formal approach of L.B. a bit better. I personally don't like using string values as functional code, but that's just me. If I could accept both answers: I would. I guess Shahin wil have to make due with 'just' an upvote.

Original source

Related problems