AkbarAzizi Ответов: 2

Десериализация строки JSON в список объектов


Я вызываю REST API и получаю ответ в виде текста JSON с форматом, который использует редактор JSON https://jsoneditoronline.org я тоже не умею читать.

Часть текста JSON выглядит следующим образом:

"{\"displayFieldName\":\"address\",\"fieldAliases\":{\"objectid\":\"objectid\",\"address_id\":\"adressutal\",\"address\":\"adressa\",\"house_no\":\"húsanr.\",\"house_digit\":\"húsatal\",\"house_letter\":\"húsastavur.\",\"street_id\":\"vegur ID\",\"street_name\":\"veganavn.\",\"zip\":\"postnr.\",\"city\":\"stað\",\"municipality\":\"kommuna\",\"cadastral_district\":\"markatalsbygd\",\"cadastral_no\":\"matr. nr.\",\"longitude\":\"longdarstig\",\"latitude\":\"breiddarsting\",\"google_streets_url\":\"vís á google streets\",\"address_city\":\"adressa og bygd\",\"cadastral_mslink\":\"mslink av matrikul\"},\"geometryType\":\"esriGeometryPoint\",\"spatialReference\":{\"wkid\":5316,\"latestWkid\":5316},\"fields\":[{\"name\":\"objectid\",\"type\":\"esriFieldTypeOID\",\"alias\":\"objectid\"},{\"name\":\"address_id\",\"type\":\"esriFieldTypeInteger\",\"alias\":\"adressutal\"},{\"name\":\"address\",\"type\":\"esriFieldTypeString\",\"alias\":\"adressa\",\"length\":60},{\"name\":\"house_no\",\"type\":\"esriFieldTypeString\",


Текст содержит список адресов со следующей структурой:

точка публичного класса
{
public int X { get; set; }
public int Y { get; set; }
}

публичный адрес класса
{
public int objectid { get; set; }
public int address_id { get; set; }
общественного строка адреса { получить; набор; }
public int house_no { get; set; }
public int house_digit { get; set; }
public int house_letter { get; set; }
public int street_id { get; set; }
общественного строка название_улицы { получить; набор; }
public int zip { get; set; }
public string city { get; set; }
муниципалитет общественная int { получить; набор; }
public int kastastaral_district { get; set; }
public int кадастр_но { get; set; }
public int longitude { get; set; }
public int latitude { get; set; }
публичная строка google_streets_url { get; set; }
публичная строка address_city { get; set; }
cadastral_mslink публичных строку { получить; набор; }
точки общественного пункта { получить; набор; }
}

Как я могу десериализовать такой текст JSON?

Что я уже пробовал:

Я уже пробовал этот код:

var objectList = JsonConvert.DeserializeObject
(jsonResponse);

но это не работает.

2 Ответов

Рейтинг:
1

OriginalGriff

Если это ваша полная строка JSON, то нет, она не будет работать - она неполная и не хватает нескольких близких скобок, как квадратных, так и фигурных. Помните, что при просмотре строки в Visual Studio она показывает двойные кавычки как экранированные символы: '"' будет отображаться как'\"', как и в вашем тексте - если экранирующий символ физически присутствует в вашей строке, то JSON не будет обрабатывать его правильно.

Добавление доводчиков и удаление побегов дает это:

{"displayFieldName":"address","fieldAliases":{"objectid":"objectid","address_id":"adressutal","address":"adressa","house_no":"húsanr.","house_digit":"húsatal","house_letter":"húsastavur.","street_id":"vegur ID","street_name":"veganavn.","zip":"postnr.","city":"stað","municipality":"kommuna","cadastral_district":"markatalsbygd","cadastral_no":"matr. nr.","longitude":"longdarstig","latitude":"breiddarsting","google_streets_url":"vís á google streets","address_city":"adressa og bygd","cadastral_mslink":"mslink av matrikul"}
,"geometryType":"esriGeometryPoint","spatialReference":{"wkid":5316,"latestWkid":5316}
,"fields":[{"name":"objectid","type":"esriFieldTypeOID","alias":"objectid"}
,{"name":"address_id","type":"esriFieldTypeInteger","alias":"adressutal"}
,{"name":"address","type":"esriFieldTypeString","alias":"adressa","length":60}
,{"name":"house_no","type":"esriFieldTypeString"} ]}
Который делает синтаксический анализ в соответствии с json2csharp - генерация классов c# из json[^] и это наводит на мысль о классах:
public class FieldAliases
{
    public string objectid { get; set; }
    public string address_id { get; set; }
    public string address { get; set; }
    public string house_no { get; set; }
    public string house_digit { get; set; }
    public string house_letter { get; set; }
    public string street_id { get; set; }
    public string street_name { get; set; }
    public string zip { get; set; }
    public string city { get; set; }
    public string municipality { get; set; }
    public string cadastral_district { get; set; }
    public string cadastral_no { get; set; }
    public string longitude { get; set; }
    public string latitude { get; set; }
    public string google_streets_url { get; set; }
    public string address_city { get; set; }
    public string cadastral_mslink { get; set; }
}

public class SpatialReference
{
    public int wkid { get; set; }
    public int latestWkid { get; set; }
}

public class Field
{
    public string name { get; set; }
    public string type { get; set; }
    public string alias { get; set; }
    public int? length { get; set; }
}

public class RootObject
{
    public string displayFieldName { get; set; }
    public FieldAliases fieldAliases { get; set; }
    public string geometryType { get; set; }
    public SpatialReference spatialReference { get; set; }
    public List<Field> fields { get; set; }
}
Что не соответствует вашим классам!


Рейтинг:
0

Graeme_Grant

Хорошим инструментом для создания ваших классов C# из JSON является JSON Utils: генерация C#, VB.Net, таблица SQL, Java и PHP из JSON[^ Что касается десериализации, то я написал статью, которая ответит на все ваши вопросы: Работа с JSON в C# и VB[^]