2

私の c# プロジェクトでは、複雑でネストされたJSON内の特定の情報 (POI距離)にアクセスしたいと考えています。

この JSON は、Azure Maps API 呼び出しの結果です。

オブジェクトにデシリアライズしようとしました。しかし、この JSON は複雑すぎて実行できません。

必要な情報を抽出する最良の方法は何ですか?

{
  "summary": {
    "query": "university",
    "queryType": "NON_NEAR",
    "queryTime": 103,
    "numResults": 1,
    "offset": 0,
    "totalResults": 216684,
    "fuzzyLevel": 1,
    "geoBias": {
      "lat": 48.008446,
      "lon": 7.821583
    }
  },
  "results": [
    {
      "type": "POI",
      "id": "DE/POI/p0/1505647",
      "score": 2.574,
      "dist": 774.6544330765787,
      "info": "search:ta:276009006412786-DE",
      "poi": {
        "name": "Universität Freiburg Medizinische Fakultät",
        "phone": "+(49)-(761)-27072350",
        "url": "www.med.uni-freiburg.de",
        "categories": [
          "college/university"
        ],
        "classifications": [
          {
            "code": "COLLEGE_UNIVERSITY",
            "names": [
              {
                "nameLocale": "en-US",
                "name": "college/university"
              }
            ]
          }
        ]
      },
      "address": {
        "streetName": "Elsässer Straße",
        "municipalitySubdivision": "Mooswald",
        "municipality": "Freiburg im Breisgau",
        "countrySecondarySubdivision": "Freiburg im Breisgau",
        "countrySubdivision": "Baden-Württemberg",
        "postalCode": "79110",
        "countryCode": "DE",
        "country": "Germany",
        "countryCodeISO3": "DEU",
        "freeformAddress": "Elsässer Straße, 79110 Freiburg Im Breisgau"
      },
      "position": {
        "lat": 48.00894,
        "lon": 7.83197
      },
      "viewport": {
        "topLeftPoint": {
          "lat": 48.00984,
          "lon": 7.83063
        },
        "btmRightPoint": {
          "lat": 48.00804,
          "lon": 7.83331
        }
      },
      "entryPoints": [
        {
          "type": "main",
          "position": {
            "lat": 48.00931,
            "lon": 7.83259
          }
        }
      ]
    }
  ]
}
4

3 に答える 3

1

少なくとも 2 つの解決策が考えられます。

期待しているjsonの内容を反映するクラスを作成するか

public class MyJSON
{
  public Summary summary { get; set; }

  public List<Result> results { get; set; }
  ...
}

public class Summary
{
   public string query { get; set; }
   ...
}

次に、 Newtonsoft.Json を使用して逆シリアル化できます

JsonConvert.DeserializeObject<MyJSON>(jsonstring);

または、動的オブジェクトに直接逆シリアル化し、名前でプロパティに直接アクセスすることもできます。

  dynamic data = JsonConvert.DeserializeObject<dynamic>(jsonstring);      
  string query = data[0].summary.query;

解決策 1 では、最初にクラスを作成する必要がありますが、より高速で安全にアクセスできます (間違った名前付けやデータ構造の変更が発生しにくくなります)。

解決策 2 は、より不安定で柔軟性が高く、必要なものにアクセスするだけです。ただし、json オブジェクトに存在しないプロパティにアクセスしようとすると、例外が発生する可能性があります。

于 2019-03-27T18:16:52.333 に答える