1

尝试将 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);
    }
4

3 回答 3

0

问题是这里的 ResultSet 实际上是“动态”类型,因为你创建了一个匿名类

                     select new
                     {
                       cms.CUSTNUM
                     }

因此有两种方法可以做到这一点。将您的选择更改为直接选择返回 cms.CUSTNUM 以获取字符串列表(但 JSON 不会将 CUSTNUM 作为属性),或者您在此处创建一个支持您的类。

1.

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

(那么你可以在这里使用 List<string>)

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);
}
于 2020-04-14T20:23:44.870 回答
0

您正在尝试将匿名类型对象的序列化列表反序列化为字符串列表。解析器在遇到第一个属性名称后的冒号时会阻塞。我认为没有办法使用 NewtonSoft 反序列化为匿名类型的列表。但是,您可以反序列化为 a Dictionary<string, string>

Dictionary<string, string>> dict = JsonConvert.DeserializeObject<Dictionary<string, string>>>(sRetVal_Json);
于 2020-04-14T19:51:34.090 回答
0

序列化然后反序列化以获取字符串列表是没有意义的。你仍然有同样的问题,你只是在做不必要的处理。

如果您想要的话,将您的投影更改为只选择该值。然后ToList()如果序列中有任何项目:

var ResultSet = (from cms in MASadminE.MOM_CMS
                     where cms.ORDER == sOrdNum
                     select cms.CUSTNUM);
if(ResultSet.Any()) 
{
    List<string> custnums = ResultSet.ToList();
}
于 2020-04-14T19:52:05.617 回答