2012-06-15 12 views
15

Mam "prosty" scenariusz: przeczytaj plik JSON, przefiltruj lub zmień niektóre wartości i zapisz wynikowy json bez zmiany oryginalnego formatowania.C# Manipulowanie danymi JSON

Tak na przykład, aby to zmienić:

{ 
    "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 
      ] 
      ] 
     ] 
     } 
    } 
    ] 
} 

Do tego:

{ 
    "type": "FeatureCollection", 
    "crs": { 
    "type": "EPSG", 
    "properties": { 
     "code": 28992 
    } 
    }, 
    "features": [ 
    { 
     "type": "Feature", 
     "geometry": { 
     "type": "Point", 
     "coordinates": 
      [ 
       149886.192, 
       374554.705 
      ] 
     } 
    } 
    ] 
} 

Próbowałem Json.NET przez newtonsoft m.in. lecz tylko to znajdę to:

  • odczytać do obiektu
  • napisać obiekt do json

Ale brakuje mi kroku "zmień obiekt". Jakieś wskazówki?

Aktualizacja

Oto, co starałem dotąd:

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"; 
} 

Ale to tylko zmienia wartość zmiennej geoType. Spodziewałem się również zmiany wartości wewnątrz geometrii. Potrzebuję odniesienia, a nie kopii! czy to możliwe?

Aktualizacja

Jestem obecnie poza tym projekcie, ale chciałbym dać moje komentarze do Główni odpowiadający. Chociaż lubię prostotę Shahin, podoba mi się bardziej formalne podejście L.B. trochę lepiej. Osobiście nie lubię używać wartości łańcuchowych jako kodu funkcjonalnego, ale to tylko ja. Gdybym mógł przyjąć obie odpowiedzi: chciałbym. Sądzę, że Shahin będzie musiał zrobić to z powodu "sprawiedliwego" uprowadzenia.

+1

Nie przepracowałem tego, ale wygląda na to, że użyłbym tego typu dynamicznego. Zobacz tutaj: http://stackoverflow.com/questions/3142495/deserialize-json-into-c-sharp-dynamic-object – McGarnagle

Odpowiedz

12
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(); 
0
  1. Korzystanie Json.net trzeba utworzyć podmiotów reprezentujących json

  2. deserializacji json do tych enties jak Json.Convert<FeatureCollection>(json)

  3. Zmian podmioty

  4. przekonwertować go z powrotem do json.

+0

Dziękuję, ale to wiedziałem. Chciałbym pominąć fazę potrzeby tworzenia własnego obiektu i bezpośredniej edycji deserializowanych danych. – Nebula

+0

dlaczego próbujesz deserializować json w dynamics za pomocą json.net, a następnie go zmienić? –

1

Jeśli nie chcesz przy użyciu dowolnego podmiot reprezentujący swój JSON, można deserializować do słownika za pomocą Json.NET i modyfikować słownika, a następnie go do serializacji JSON za pomocą Json.NET.

0

Wiem, że to już zostało odebrane, ale myślałem, że mam rozwiązanie, które inni mogą uznać za interesujące.

Posiadałem dość duży obiekt JSON, który otrzymałam od klienta i potrzebowałem go zmanipulować w C#, a następnie powrócić w postaci ciągów do aplikacji wywołującej.

Nie ma sensu modelowanie każdego aspektu obiektu, wiele części, których nie planowałem manipulować, często się zmieniało i nie można było oczekiwać, że zaktualizuję moją aplikację za każdym razem, gdy osoba dzwoniąca zmodyfikowała część ich Obiekt JSON Nie byłem poproszony o manipulowanie. Więc próbowałem to, to trochę brzydki, ale to działa dobrze:

  1. Utwórz klasę (myClass) reprezentujący tylko sekcji chcesz manipulować.
  2. Korzystanie Newtonsoft utworzyć dynamiczną wersję stringified obiekt JSON:

    dynamic jsonObj = JsonConvert.DeserializeObject(stringifiedJsonObject); 
    
  3. Zbuduj swój obiekt zastępczy przy użyciu utworzonego powyżej klasę (myClass). Następnie serializacji, że obiekt przy

    string stringPartialJsonObj = JsonConvert.SerializeObject(myClass); 
    
  4. Dalej, (a jest to podstęp) deserializowania właśnie utworzony obiekt. Teraz jest tego samego typu co twoje źródło.

    dynamic partialJsonObj = JsonConvert.Deserialize(stringPartialJsonObj); 
    
  5. Imagine (przez wzgląd na tej demonstracji) W pierwotnym obiekt JSON, musiałem zmodyfikować obiekt w obj.ConfigurationData.Configuration1.Data. To jest jak zrobiłbym to:

    jsonObj.ConfigurationData.Configuration1.Data = partialJsonObj; 
    
  6. Wreszcie, bym ponownie serializacji całość i wysłać go z powrotem do użytkownika:

    return JsonConvert.SerializeObject(jsonObj); 
    

to trochę niezgrabne , ale działa. Historia mojego życia :-)

Powiązane problemy