web-dev-qa-db-ja.com

API応答の解析中に予期しない文字が検出されました

私はこの例外を受けています:

Newtonsoft.Json.JsonReaderException HResult = 0x80131500 Message =値の解析中に予期しない文字が見つかりました:{。パス 'outputObject.address'、17行目、16桁目。

aPIからの応答データを逆シリアル化するとき。 (投稿の最後の完全な例外)

[〜#〜]コード[〜#〜]

return JsonConvert.DeserializeObject(webResponseEntity.ResponseData, typeof(CarLookupResponse)) as CarLookupResponse;

[〜#〜]モデル[〜#〜]

   public class CarLookupResponse : ICarLookupResponse
    {
        public ICarLookupResult Result { get; set; }

        public ICarLookupOutputObject OutputObject { get; set; }

        public CarLookupResponse()
        {
            Result = new CarLookupResult();
            OutputObject = new CarLookupOutputObject();
        }
    }

Folowingは出力オブジェクトインターフェイスですOutputObject Interface

public interface ICarLookupOutputObject 
    {
        int  CarId { get; set; }

        string CartestId { get; set; }

        int[] ModelYears { get; set; }

        string FirstName { get; set; }

        string LastName { get; set; }

        string Email { get; set; }

        string SSN { get; set; }

        string Address { get; set; }
    }

[〜#〜] json [〜#〜]

   {
     "result": {
        "id": 1,
        "value": "lookup successful.",
        "error": null
      },
      "outputObject": {
        "CarId": 2025,
        "CartestId": "testing-02",
        "ModelYears": [
          2017,
          2018
        ],
        "firstName": "Troy",
        "lastName": "Aaster",
        "email": "[email protected]",
        "address": {
          "apartment": "",
          "state": "CA",
          "city": "BRISBANE",
          "zipCode": "94005",
          "streetAddress": "785, SPITZ BLVD"
        },
        "ssn": "511-04-6666"
      }
    }

この例外の理由を見つけようとしましたが、取得できませんでした[〜#〜] json [〜#〜]は有効であることを確認しました。

以下は、例外の完全な例外です

Newtonsoft.Json.JsonReaderException HResult = 0x80131500 Message =値の解析中に予期しない文字が見つかりました:{。パス 'outputObject.address'、17行目、16行目。Source= Newtonsoft.Json StackTrace:at Newtonsoft.Json.JsonTextReader.ReadStringValue(ReadType readType)at Newtonsoft.Json.JsonTextReader.ReadAsString()at Newtonsoft.Json.JsonReader.ReadForType (JsonContractコントラクト、ブールhasConverter)at Newtonsoft.Json.Serialization.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject、JsonReader reader、JsonObjectContract contract、JsonProperty member、String id)at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader、Type JsonContractコントラクト、JsonPropertyメンバー、JsonContainerContract containerContract、JsonProperty containerMember、Object existingValue)at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.SetPropertyValue(JsonProperty property、JsonConverter propertyConverter、JsonContainerContract containerContract、JsonProperty containerProperty、JsonReader atizationJonReader。 .JsonSeriali Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader、Type objectType、JsonContractコントラクト、JsonPropertyメンバー、JsonContainerContractコンテナーコンテナ、JsonPropertyコンテナーのzerInternalReader.PopulateObject(Object newObject、JsonReaderリーダー、JsonObjectContractコントラクト、JsonPropertyメンバー、String id) )at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader、Type objectType、Boolean checkAdditionalContent)at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader、Type objectType)at Newtonsoft.Json.JsonConvert.DeserializeObject(Type 、JsonSerializerSettings設定)

あなたの問題は、CarLookupOutputObject.Addressstringとして宣言したことですが、対応するJSON値はオブジェクトです:

"address": {
  "apartment": "",
  ...
},

シリアル化ガイド で説明されているように、プリミティブな.Netタイプとstringに変換可能なタイプのみがJSON文字列としてシリアル化されます。 "address"の値はプリミティブではないため、例外がスローされます。

代わりに、 http://json2csharp.com/ で推奨されているように、データモデルを次のように変更します。

public class CarLookupOutputObject 
{
    public Address address { get; set; }

    // Remainder unchanged
}

public class Address
{
    public string apartment { get; set; }
    public string state { get; set; }
    public string city { get; set; }
    public string zipCode { get; set; }
    public string streetAddress { get; set; }
}
7
dbc