Member 12586110 Ответов: 4

Десериализовать JSON-ответ и запись в базу данных


Привет, я использую родную библиотеку Microsoft вместо Newtonsoft (я не могу использовать Newtonsoft, так как приложение, которое мы используем, не поддерживает сторонние библиотеки paty) для анализа ответа json и записи в базу данных. Я застрял с тем, как анализировать json.

Ошибка, которую я получаю, такова
Цитата:
оператор foreach не может работать с переменными типа RootObject, поскольку RootObject не содержит открытого определения для GetEnumerator


Не могли бы вы меня проводить?

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

public class RootObject
{
    public string Id { get; set; }
    public string Code { get; set; }
    public string Description { get; set; }
}	
	
                string cities;

                cities = getCities();

                JavaScriptSerializer oJS = new JavaScriptSerializer();
                RootObject oRootObject = new RootObject();
                oRootObject = oJS.Deserialize<RootObject>(cities);

                string connectionString = @"Data Source=server\SQLEXPRESS;Initial Catalog=TestDB;Integrated Security=SSPI;";							
                string sqlTable = "test";

            foreach (var city in oRootObject) //foreach statement cannot operate on variables of type RootObject because RootObject does not contain a public definition for GetEnumerator
			{
				using (SqlConnection sc = new SqlConnection(connectionString))
                {
                    sc.Open();
                    using (SqlBulkCopy sbc = new SqlBulkCopy(sc))
                    {
                        sbc.DestinationTableName = sqlTable;
                        sbc.BatchSize = dt.Rows.Count;
                        sbc.BulkCopyTimeout = 0;
                        sbc.ColumnMappings.Add("Id", "Id");
                        sbc.ColumnMappings.Add("Code", "Code");
                        sbc.ColumnMappings.Add("Description", "Description");

                        sbc.WriteToServer(dt);
                    }
                }	
			}

формат JSON

[
{
    "Id": "1",
    "Code": "Man",
    "Description": "Manchester"
},
{
    "Id": "2",
    "Code": "Lon",
    "Description": "London"
}
]

Member 12586110

Спасибо всем за ваш ответ. Я все еще можете получить тайную строку JSON в качестве пользовательской .чистый объект. Я буду продолжать работать над этим и держать вас в курсе, как я исследую больше.

С уважением

4 Ответов

Рейтинг:
2

Wendelius

Вы не можете использовать для каждого из них, потому что oRootObject-это не список, а всего лишь один объект.

если ответ представляет собой список объектов, вы можете попробовать что-то вроде

...
cities = getCities();
JavaScriptSerializer oJS = new JavaScriptSerializer();
var rootObjects = oJS.Deserialize<List<RootObject>>(cities);
...
foreach (var city in rootObjects)
...


Рейтинг:
2

OriginalGriff

Ну, нет - это не так.
И вы ничего не можете с этим поделать, потому что он также не содержит коллекции элементов, поэтому нет ничего, что вы могли бы повторить, поэтому нет ничего, с чем вы могли бы написать перечислитель для работы, и, следовательно, ничего, что вы могли бы сделать. foreach может обрабатывать.

Начните с того, что возьмите свой JSON и передайте его генератору классов: json2csharp - генерация классов c# из json[^] это тот, который я использую.
Затем посмотрите на классы и посмотрите, с чем вы должны работать. Если вам нужно обработать JSON, который изменяет структуру, вы можете затем работать обратно с теми, кто использует ваш JSON, чтобы создать код, который имеет смутные шансы на работу.


Рейтинг:
2

Graeme_Grant

Я написал статью, чтобы ответить на такие вопросы, как этот: Работа с JSON в C# и VB[^]


Рейтинг:
1

RickZeeland

Может быть, вы можете попробовать Класс DataContractJsonSerializer (System.Runtime.Сериализация.Json) | Microsoft Docs[^]

Или используйте исходный код из такой библиотеки, как https://github.com/jontiefer/Tiferix.Json[^]