Почему при использовании Newtonsoft появляется строка «Неожиданный символ при синтаксическом анализе значения». Json .DeserializeObject со строкой? - PullRequest
1 голос
/ 14 апреля 2020

Я получаю упомянутую ошибку при попытке 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);
    }

Ответы [ 3 ]

0 голосов
/ 14 апреля 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();
}
0 голосов
/ 14 апреля 2020

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

                     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);
}
0 голосов
/ 14 апреля 2020

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

Dictionary<string, string>> dict = JsonConvert.DeserializeObject<Dictionary<string, string>>>(sRetVal_Json);
...