Что JSON не является массивом Foo
JSON. Код JsonConvert.DeserializeObject
будет разбирать строку JSON от корня вверх, а ваш тип T
должен точно соответствовать этой структуре JSON. Синтаксический анализатор не собирается гадать , член JSON должен представлять List
, который вы ищете.
Вам нужен корневой объект, представляющий JSON из корневой элемент.
Вы можете легко позволить классам делать это, создаваемое из образца JSON. Для этого скопируйте свой JSON и нажмите Edit -> Paste Special -> Paste JSON As Classes
в Visual Studio.
В качестве альтернативы вы можете сделать то же самое на http://json2csharp.com , который генерирует больше или меньше тех же классов.
Вы увидите, что коллекция фактически является одним элементом глубже, чем ожидалось:
public class Foo
{
public string bar { get; set; }
}
public class RootObject
{
public List foo { get; set; }
}
Теперь вы можете десериализовать JSON из корня (и быть уверенным переименовать RootObject
в нечто полезное):
var rootObject = JsonConvert.DeserializeObject(jsonString);
И получить доступ к коллекции:
foreach (var foo in rootObject.foo)
{
// foo is a `Foo`
}
Вы всегда можете переименовать свойства, чтобы следовать за своим соглашением об обсадке, и применить JsonProperty
:
public class Foo
{
[JsonProperty("bar")]
public string Bar { get; set; }
}
Также убедитесь, что JSON содержит достаточно данных образца. Парсер класса должен угадать соответствующий тип C # на основе содержимого, содержащегося в JSON.
Небольшая поправка - для успешного разрешения имени по клинету
extern "C"
должно быть таким же, как при экспорте, так и при импорте.
extern «C» сократит имя процедуры до: «_GetName».
Более того, вы можете указать любое имя с помощью раздела EXPORTS в файле .def
правильный ответ следующий:
extern "C" int MyFunc(int param);
и
int MyFunc(int param);
- это два объявления, в которых используются разные внутренние имена, первое - в стиле C, второе - в Стиль С ++.
внутреннее именование, необходимое для инструментов сборки, чтобы определить, какие аргументы получает функция, какой тип возвращает и т. Д., Поскольку C ++ более сложный (упс, перегруженные, виртуальные функции и т. Д.) - он использует более сложное именование. Соглашение о вызовах также влияет на именование c и c ++.
оба эти стиля именования применяются при одинаковом использовании __declspec (dllexport).
Если вы хотите пропустить искажение имени экспортируемой подпрограммы, добавьте файл определения модуля в свой проект, введите его (в этом случае вам не требуется declspec dllexport):
LIBRARY mylib
EXPORTS
MyFunc
это пропустит явное оформление имени (примеры ниже).
_MyFunc (c style, __cdecl)
_MyFunc@4 (c style, __stdcall)
?MyFunc@@YAHH@Z (c++ style, __cdecl)
?MyFunc@@YGHH@Z (c++ style, __stdcall)
Это нормально для экспорта DLL с соглашением __ stdcall
. @N
указывает количество байтов, которые функция принимает в свои аргументы - в вашем случае ноль.
Обратите внимание, что страница MSDN при экспорте из DLL специально говорит «использовать соглашение о вызовах __stdcall» при использовании «ключевого слова __declspec (dllexport) в определении функции».