Почему я получаю неожиданный символ при анализе значения при использовании Newtonsoft.Json.DeserializeObject со строкой?

Я получаю указанную ошибку при попытке DeserializeObject() в список строк.
ResultSet в порядке и создает строку как:
string sRetVal_Json = new JavaScriptSerializer().Serialize(ResultSet);
также отлично работает.
Результирующая строка, например:
sRetVal_Json = "[{\"CUSTNUM\":\"8690\"}]"

Вот фрагмент кода:

    var ResultSet = (from cms in MASadminE.MOM_CMS
                     where cms.ORDER == sOrdNum
                     select new
                     {
                       cms.CUSTNUM
                     });
    List<string> list = new List<string>();
    string sRetVal_Json = new JavaScriptSerializer().Serialize(ResultSet);
    if (sRetVal_Json != "[]") // got > 0 records
    {
      list = JsonConvert.DeserializeObject<List<string>>(sRetVal_Json);
    }

person Gary Huckabone    schedule 14.04.2020    source источник
comment
ResultSet уже десериализован, я не понимаю, что вы пытаетесь сделать.   -  person Crowcoder    schedule 14.04.2020
comment
@Crowcoder - похоже, он пытается перейти от строки JSON ("[{\"CUSTNUM\":\"8690\"}]") обратно к объекту.   -  person FoggyDay    schedule 14.04.2020


Ответы (3)


Вы пытаетесь десериализовать сериализованный список анонимно типизированных объектов в список строк. Синтаксический анализатор задыхается, когда сталкивается с двоеточием после имени первого свойства. Я не думаю, что есть способ использовать NewtonSoft для десериализации в список анонимного типа. Однако вы можете десериализовать в Dictionary<string, string>:

Dictionary<string, string>> dict = JsonConvert.DeserializeObject<Dictionary<string, string>>>(sRetVal_Json);
person D Stanley    schedule 14.04.2020

Нет смысла сериализовать, а затем десериализовать, чтобы получить список строк. У вас все та же проблема, и вы просто выполняете ненужную обработку.

Измените свою проекцию, чтобы просто выбрать значение, если это все, что вам нужно. Затем ToList(), если в последовательности есть какие-либо элементы:

var ResultSet = (from cms in MASadminE.MOM_CMS
                     where cms.ORDER == sOrdNum
                     select cms.CUSTNUM);
if(ResultSet.Any()) 
{
    List<string> custnums = ResultSet.ToList();
}
person Crowcoder    schedule 14.04.2020

Проблема в том, что ResultSet здесь на самом деле является «динамическим» типом, потому что вы создали анонимный класс, когда вы это сделали.

                     select new
                     {
                       cms.CUSTNUM
                     }

Таким образом, есть 2 способа сделать это. Либо измените свой выбор, чтобы выбрать обратно cms.CUSTNUM напрямую, чтобы получить список строк (но JSON не будет иметь CUSTNUM в качестве свойства), либо вы создадите класс, который будет поддерживать вас здесь.

1.

 var ResultSet = (from cms in MASadminE.MOM_CMS
                     where cms.ORDER == sOrdNum
                     select  cms.CUSTNUM).ToList();

(Тогда вы можете использовать строку List‹ > здесь)

2.

public class MyData
{
    public string CUSTNUM { get; set; }
}


var ResultSet = (from cms in MASadminE.MOM_CMS
                 where cms.ORDER == sOrdNum
                 select new MyData
                 {
                   CUSTNUM = cms.CUSTNUM
                 });
List<MyData> list = new List<MyData>();
string sRetVal_Json = new JavaScriptSerializer().Serialize(ResultSet);
if (sRetVal_Json != "[]") // got > 0 records
{
  list = JsonConvert.DeserializeObject<List<MyData>>(sRetVal_Json);
}
person Daniel Lorenz    schedule 14.04.2020