Недопустимый примитив JSON: . Попытка десериализации из JSON в C#

#c# #json #json-deserialization

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

Вопрос:

Мне нужно десериализовать некоторые данные на стороне сервера от третьей стороны (это делается на стороне сервера по соображениям доступности, а не по выбору). Однако я получаю

Я вызываю следующую строку кода:

 var data = new JavaScriptSerializer().Deserialize<TPOData>(responseFromServer);
  

Ответ с сервера следующий:

 {
  "name": "TPO",
  "columns": [
    "ogc_fid",
    "orderref",
    "status",
    "entityref",
    "treetype",
    "comments",
    "orderyear",
    "label",
    "dist"
 ],
 "data": [
   [
      360,
      "07/1970/WR ",
      "Tree       ",
      "T6   ",
      "Chestnut",
      "Position checked against Scanned Order 13/11/2008",
      1970,
      "479055.705,204698.514",
      33
   ],
   [
      361,
      "07/1970/WR ",
      "Tree       ",
      "T7   ",
      "May",
      "Position checked against Scanned Order 13/11/2008",
      1970,
      "479061.747,204685.09",
      35
   ]
 ]
}
  

Я пытаюсь десериализовать в объект TPOData:

 public class TPOData
{
    public string name;
    public List<string> columns;
    public List<List<object>> data;
}
  

Я попытался изменить данные свойства. В дополнение к вышесказанному я пробовал List<object> , List<object[]> , object[][] object[] , object List<List<string>> . Я даже пробовал, int надеясь, что это может преобразовать в,, значения. Ничего не помогло. Я подозреваю, что проблема заключается в том, что данные на 2-м уровне массива объектов представляют собой смесь значений int и string. Я выполнил очень похожую задачу, где 2-й уровень был полностью строковым, поэтому я мог просто использовать List<List<string>> без проблем.

Любая помощь была бы высоко оценена.

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

1. Похоже, что проблема возникает из класса JsonScriptSerializer. Данный JSON-файл десериализуется для объекта вашего класса, когда я использую Newtonsoft.Json. JsonConvert (без каких-либо проблем).

Ответ №1:

Я попробовал ваш пример, и он отлично сработал для меня, используя JavaScriptSerializer with List<List<object>> внутри TPOData класса. Тестовая программа, которую я использовал, скопирована ниже. Обратите внимание, что я использую .NET Framework версии 4.5, на случай, если это имеет значение. Есть ли что-то еще в JSON или вашем коде, которое вы не показали, что может быть причиной проблемы?

 class Program
{
    static void Main(string[] args)
    {
        string json = @"
        {
            ""name"": ""TPO"",
            ""columns"": [
                ""ogc_fid"",
                ""orderref"",
                ""status"",
                ""entityref"",
                ""treetype"",
                ""comments"",
                ""orderyear"",
                ""label"",
                ""dist""
            ],
            ""data"": [
                [
                    360,
                    ""07/1970/WR "",
                    ""Tree       "",
                    ""T6   "",
                    ""Chestnut"",
                    ""Position checked against Scanned Order 13/11/2008"",
                    1970,
                    ""479055.705,204698.514"",
                    33
                ],
                [
                    361,
                    ""07/1970/WR "",
                    ""Tree       "",
                    ""T7   "",
                    ""May"",
                    ""Position checked against Scanned Order 13/11/2008"",
                    1970,
                    ""479061.747,204685.09"",
                    35
                ]
            ]
        }";

        var data = new JavaScriptSerializer().Deserialize<TPOData>(json);

        Console.WriteLine("name: "   data.name);
        Console.WriteLine();
        foreach (var row in data.data)
        {
            for (int i = 0; i < data.columns.Count; i  )
            {
                Console.WriteLine(data.columns[i]   ": "   row[i]);
            }
            Console.WriteLine();
        }
    }

    public class TPOData
    {
        public string name;
        public List<string> columns;
        public List<List<object>> data;
    }
}
  

Вывод:

 name: TPO

ogc_fid: 360
orderref: 07/1970/WR
status: Tree
entityref: T6
treetype: Chestnut
comments: Position checked against Scanned Order 13/11/2008
orderyear: 1970
label: 479055.705,204698.514
dist: 33

ogc_fid: 361
orderref: 07/1970/WR
status: Tree
entityref: T7
treetype: May
comments: Position checked against Scanned Order 13/11/2008
orderyear: 1970
label: 479061.747,204685.09
dist: 35