2012-06-15 59 views
15

Tôi có một kịch bản 'đơn giản': Đọc một số tệp JSON, Lọc hoặc thay đổi một số giá trị và viết lại kết quả mà không thay đổi định dạng gốc.C# Thao tác với dữ liệu JSON

Vì vậy, ví dụ để thay đổi điều này:

{ 
    "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 này:

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

Tôi đã thử JSON.Net bởi newtonsoft số những người khác nhưng chỉ này, tôi có thể tìm thấy là:

  • đọc vào đối tượng
  • write object to json

Nhưng tôi đang thiếu bước 'thay đổi đối tượng'. Bất kỳ gợi ý nào?

Cập nhật

Đây là những gì tôi đã cố gắng cho đến nay:

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

Nhưng điều này chỉ thay đổi giá trị của biến geoType. Tôi cũng muốn thay đổi giá trị bên trong hình học. Tôi cần một tài liệu tham khảo, không phải là một bản sao! Điều này có thể không?

Cập nhật

Tôi hiện đang tắt dự án này nhưng tôi muốn đưa ra phản hồi của tôi với người trả lời. Mặc dù tôi thích sự đơn giản của Shahin, tôi thích cách tiếp cận chính thức hơn của L.B. tốt hơn một chút. Cá nhân tôi không thích sử dụng các giá trị chuỗi như mã chức năng, nhưng đó chỉ là tôi. Nếu tôi có thể chấp nhận cả hai câu trả lời: tôi sẽ. Tôi đoán Shahin phải làm gì với 'chỉ' một upvote.

+1

Tôi chưa thực sự làm việc này, nhưng có vẻ như loại động sẽ hữu ích cho việc này. Xem ở đây: http://stackoverflow.com/questions/3142495/deserialize-json-into-c-sharp-dynamic-object – McGarnagle

Trả lời

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. Sử dụng Json.net bạn đã tạo ra các đối tượng đại diện cho bạn json

  2. Deserialize các json vào những Cty như Json.Convert<FeatureCollection>(json)

  3. Thay đổi các thực thể

  4. Chuyển đổi nó trở lại json.

+0

Cảm ơn bạn, nhưng điều này tôi biết. Tôi muốn bỏ qua giai đoạn cần tạo đối tượng của riêng mình và chỉnh sửa trực tiếp dữ liệu được deserialized. – Nebula

+0

tại sao bạn thử deserialize json thành động bằng json.net và sau đó thay đổi nó? –

1

Nếu bạn không muốn sử dụng bất kỳ thực thể nào đại diện cho JSON của bạn, bạn có thể deserialize từ điển bằng cách sử dụng json.net và sửa đổi từ điển, sau đó serialize nó vào JSON bằng cách sử dụng Json.net.

0

Tôi biết điều này đã được trả lời nhưng tôi nghĩ rằng tôi có giải pháp mà người khác có thể thấy thú vị.

Tôi đã có một đối tượng JSON được xâu chuỗi khá lớn mà tôi đã nhận được từ khách hàng và cần thao tác trong C# và sau đó trả về dạng chuỗi quay lại ứng dụng gọi điện.Nó không có ý nghĩa để mô hình mọi khía cạnh của đối tượng, nhiều phần mà tôi không có kế hoạch thao tác đang thay đổi thường xuyên và tôi không thể dự kiến ​​cập nhật ứng dụng của tôi mỗi khi người gọi sửa đổi các phần của chúng Đối tượng JSON Tôi không bị yêu cầu thao túng. Vì vậy, tôi cố gắng này, đó là một chút xấu xí nhưng nó hoạt động tốt:

  1. Tạo một lớp (myClass) đại diện cho chỉ phần bạn muốn thao tác.
  2. Sử dụng Newtonsoft, tạo ra một phiên bản động của đối tượng JSON chuyển đổi thành chuỗi:

    dynamic jsonObj = JsonConvert.DeserializeObject(stringifiedJsonObject); 
    
  3. Xây dựng đối tượng thay thế của bạn bằng cách sử dụng lớp mà bạn đã tạo ở trên (myClass). Sau đó, tuần tự hóa đối tượng đó bằng cách sử dụng

    string stringPartialJsonObj = JsonConvert.SerializeObject(myClass); 
    
  4. Tiếp theo, (và đây là mẹo) deserialize đối tượng bạn vừa tạo. Bây giờ nó cùng loại với nguồn của bạn.

    dynamic partialJsonObj = JsonConvert.Deserialize(stringPartialJsonObj); 
    
  5. Hãy tưởng tượng (vì lợi ích của cuộc biểu tình này) trong đối tượng JSON gốc, tôi cần phải sửa đổi các đối tượng trong obj.ConfigurationData.Configuration1.Data. Đây là cách tôi muốn làm điều đó:

    jsonObj.ConfigurationData.Configuration1.Data = partialJsonObj; 
    
  6. Cuối cùng, tôi muốn tái serialize toàn bộ điều và gửi lại cho người sử dụng:

    return JsonConvert.SerializeObject(jsonObj); 
    

Đó là một chút vụng về , nhưng nó đã có tác dụng. Câu chuyện về cuộc sống của tôi :-)