#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. Есть еще идеи?