c # — JSON с квадратными скобками невозможно десериализовать с помощью RestSharp

#c# #json #deserialization #restsharp

#c# #json #десериализация #restsharp

Вопрос:

надеюсь, вы сможете мне помочь. Я хочу напечатать «метку» одного из элементов.

Ввод JSON:

 [
  {
    "entity":{
      "type":"postcode",
      "id":"P11516",
      "label":"18314 Divitz-Spoldershagen",
      "value":"18314"
    },
    "matches":[
      {
        "offset":0,
        "length":5
      }
    ]

  },
  {
    "entity":{
      "type":"postcode",
      "id":"P11541",
      "label":"18314 Kenz-Küstrow",
      "value":"18314"
    },
    "matches":[
      {
        "offset":0,
        "length":5
      }
    ]

  },
  {
    "entity":{
      "type":"postcode",
      "id":"P11549",
      "label":"18314 Löbnitz",
      "value":"18314"
    },
    "matches":[
      {
        "offset":0,
        "length":5
      }
    ]

  },
  {
    "entity":{
      "type":"postcode",
      "id":"P11551",
      "label":"18314 Lüdershagen",
      "value":"18314"
    },
    "matches":[
      {
        "offset":0,
        "length":5
      }
    ]
  }
]
  

И вызов API с помощью JsonDeserializer

 public string callGACWithPLZSandbox(string plz)
{
    var client = new RestClient("http://rest.sandbox-immobilienscout24.de");
    var request = new RestRequest("restapi/api/gis/v2.0/geoautocomplete/DEU", Method.GET);
    client.ClearHandlers();
    client.AddHandler("application/json", new JsonDeserializer());
    request.AddQueryParameter("i", plz);
    request.AddQueryParameter("t", "postcode");
    request.AddHeader("bla", "blub");
    IRestResponse<Rootobject> response = client.Execute<Rootobject>(request);

    return response.Data.Property1[1].entity.label;
}
  

И классы

 class Rootobject
{
    public Class1[] Property1 { get; set; }
}

class Class1
{
    public Entity entity { get; set; }
    public Match[] matches { get; set; }
}

class Entity
{
    public string type { get; set; }
    public string id { get; set; }
    public string label { get; set; }
    public string value { get; set; }
}

 class Match
{
    public int offset { get; set; }
    public int length { get; set; }
}
  

Что я делаю не так? Результатом всегда является «Исключение NullReferenceException: ссылка на объект не установлена для экземпляра объекта»…

Комментарии:

1. В двух словах, ваш JSON представляет собой массив, но вы десериализуете его в один объект. Вместо этого десериализуйте в a List<Class1> .

2. Спасибо, но return response.Data[0].entity.label; все равно выдает исключение NullReferenceException. Есть еще идеи?

Ответ №1:

У вас есть два варианта: либо изменить объект, который вы пытаетесь сериализовать, на:

 IRestResponse<List<Class1>> response = client.Execute<List<Class1>>(request);
  

Или измените свой Json на

 {
 "Property1" : [
  {
    "entity":{
      "type":"postcode",
      "id":"P11516",
      "label":"18314 Divitz-Spoldershagen",
      "value":"18314"
    },
    "matches":[
      {
        "offset":0,
        "length":5
      }
    ]

  },
  {
    "entity":{
      "type":"postcode",
      "id":"P11541",
      "label":"18314 Kenz-Küstrow",
      "value":"18314"
    },
    "matches":[
      {
        "offset":0,
        "length":5
      }
    ]

  },
  {
    "entity":{
      "type":"postcode",
      "id":"P11549",
      "label":"18314 Löbnitz",
      "value":"18314"
    },
    "matches":[
      {
        "offset":0,
        "length":5
      }
    ]

  },
  {
    "entity":{
      "type":"postcode",
      "id":"P11551",
      "label":"18314 Lüdershagen",
      "value":"18314"
    },
    "matches":[
      {
        "offset":0,
        "length":5
      }
    ]
  }
]
}
  

Если вы измените свой json, оставьте сериализующий вызов таким, какой он есть сейчас.

Комментарии:

1. Исключение NullReferenceException: ссылка на объект не установлена для экземпляра объекта PLZCounter.callGACWithPLZSandbox (System. Строка, пожалуйста) (в Assets/PLZCounter.cs:63) PLZCounter. Update () (в Assets/PLZCounter.cs:47)

2. Хорошо, я не могу изменить JSON. Но если я изменю объект, подобный этому, верните ответ. Данные [0].сущность. метка;

3. Боже, я ненавижу это поведение «ввода»… Хорошо, я не могу изменить JSON. Но если я изменю объект, как вы мне сказали, вот так, верните ответ. Данные [0].сущность. label; Я все еще получаю исключение NullReferenceException. Есть еще идеи?