17

「単純な」シナリオがあります。JSONファイルを読み取り、値の一部をフィルタリングまたは変更し、元の形式を変更せずに結果のjsonを書き戻します。

したがって、たとえばこれを変更するには:

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

これに:

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

とりわけnewtonsoftによるJSON.Netを試しましたが、これを見つけることができるのは次のとおりです。

  • オブジェクトに読み込む
  • オブジェクトをjsonに書き込む

しかし、「オブジェクトの変更」ステップがありません。ヒントはありますか?

アップデート

これが私がこれまでに試したことです:

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

ただし、これはgeoType変数の値のみを変更します。ジオメトリの値も変更することを期待していました。コピーではなく、参照が必要です!これは可能ですか?

アップデート

私は現在このプロジェクトを離れていますが、回答者にフィードバックを送りたいと思います。Shahinのシンプルさが好きですが、LBのより正式なアプローチの方が少し好きです。私は個人的に関数型コードとして文字列値を使用するのは好きではありませんが、それは私だけです。私が両方の答えを受け入れることができれば:私はそうします。Shahinは、「ただ」の賛成で期限を迎える必要があると思います。

4

4 に答える 4

16
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();
于 2012-06-15T10:30:38.047 に答える
2

これはすでに回答されていることは知っていますが、他の人が興味深いと思うかもしれない解決策があると思いました。

顧客から受け取った非常に大きな文字列化された JSON オブジェクトがあり、C# で操作してから呼び出し元のアプリケーションに文字列形式で返す必要がありました。

オブジェクトのすべての側面をモデル化することは意味がありませんでした。操作する予定がなかった多くの部分が頻繁に変更され、呼び出し元が JSON オブジェクトの一部を変更するたびにアプリケーションを更新することは期待できませんでした。操作を求められていません。だから私はこれを試しました、それは少し醜いですが、うまくいきました:

  1. 操作するセクションだけを表すクラス ( myClass) を作成します。
  2. Newtonsoft を使用して、文字列化された JSON オブジェクトの動的バージョンを作成します。

    dynamic jsonObj = JsonConvert.DeserializeObject(stringifiedJsonObject);
    
  3. 上で作成したクラスを使用して置換オブジェクトを作成します ( myClass)。次に、そのオブジェクトを次を使用してシリアル化します

    string stringPartialJsonObj = JsonConvert.SerializeObject(myClass);
    
  4. 次に、作成したばかりのオブジェクトを逆シリアル化します (これが秘訣です)。これで、ソースと同じタイプになりました。

    dynamic partialJsonObj = JsonConvert.Deserialize(stringPartialJsonObj);
    
  5. (このデモンストレーションのために) 元の Json オブジェクトを想像してくださいobj.ConfigurationData.Configuration1.Data。これは私がそれを行う方法です:

    jsonObj.ConfigurationData.Configuration1.Data = partialJsonObj;
    
  6. 最後に、全体を再シリアル化し、ユーザーに送り返します。

    return JsonConvert.SerializeObject(jsonObj);
    

それは少し不格好ですが、うまくいきます。私の人生談 :-)

于 2017-09-07T04:21:25.793 に答える
1

JSON を表すエンティティを使用したくない場合は、json.net を使用してディクショナリに逆シリアル化し、ディクショナリを変更してから、Json.net を使用してそれを JSON にシリアル化できます。

于 2012-06-15T09:32:43.307 に答える
0
  1. あなたを使用しJson.netて、あなたを表すエンティティを作成する必要がありますjson

  2. jsonを次のようなエンティティに逆シリアル化しますJson.Convert<FeatureCollection>(json)

  3. エンティティを変更する

  4. に変換し直しjsonます。

于 2012-06-15T09:13:55.623 に答える