【问题标题】:Deserialize JSON data with double quote using JavaScriptSerializer.Deserialize使用 JavaScriptSerializer.Deserialize 反序列化带有双引号的 JSON 数据
【发布时间】:2017-01-09 11:03:29
【问题描述】:

下面的 JSON 数据我正在尝试使用 JavaScriptSerializer.Deserialize 反序列化,但是,我遇到了异常。

代码:

var jsonSerialiser = new JavaScriptSerializer();
FCMCasepackVM casepack = jsonSerialiser.Deserialize<FCMCasepackVM>(selectedCasePack);

JSON 数据:

 { P_ID:"1478952", P_NM:"BAHLSEN COOKIES WAFER ROLL MILK CHOCOLATE 3.5
 OZ", BYR_ID:191, BYR_NM:"BYR_NM", VDR_ID:48532, VDR_NM:"KEHE FOOD DIST
 INC", CPK_ID:"1478952-12", CPK_DSC:"BAHLSEN COOKIES WAFER ROLL MILK
 CHOCOLAT", VDR_IT_CD_ID:"6398", UPC_ID:7056921950.0,
 CPK_PRI_FLG:"True", CPK_SRC:"PEF", **FCM_RGLT_TYP_CT:"FSV"P"**,
 CPK_P_ORIG_DSC:"", RGLN_EXCL_FLG:"False", BRND_TYP:""  }

例外

附加信息:无法转换“System.String”类型的对象 输入“Meijer.MerchProduct.FCM.Models.ViewModels.FCMCasepackVM”

即使我尝试在反序列化之前对数据进行序列化,但得到不同的异常

代码:

var jsonSerialiser = new JavaScriptSerializer();
selectedCasePack = jsonSerialiser.Serialize(selectedCasePack);
FCMCasepackVM casepack = jsonSerialiser.Deserialize<FCMCasepackVM>(selectedCasePack);

序列化后的JSON数据

 "{ P_ID:\"1478952\", P_NM:\"BAHLSEN COOKIES WAFER ROLL MILK CHOCOLATE
 3.5 OZ\", BYR_ID:191, BYR_NM:\"BYR_NM\", VDR_ID:48532, VDR_NM:\"KEHE FOOD DIST INC\", CPK_ID:\"1478952-12\", CPK_DSC:\"BAHLSEN COOKIES
 WAFER ROLL MILK CHOCOLAT\", VDR_IT_CD_ID:\"6398\",
 UPC_ID:7056921950.0, CPK_PRI_FLG:\"True\", CPK_SRC:\"PEF\",
 FCM_RGLT_TYP_CT:\"FSV\"P\", CPK_P_ORIG_DSC:\"\", RGLN_EXCL_FLG:\"False\", BRND_TYP:\"\"  }"

例外

附加信息:传入的对象无效,应为“:”或“}”。 (319): { P_ID:"1478952", P_NM:"BAHLSEN 饼干威化卷牛奶 巧克力 3.5 盎司", BYR_ID:191, BYR_NM:"BYR_NM", VDR_ID:48532, VDR_NM:"KEHE FOOD DIST INC", CPK_ID:"1478952-12", CPK_DSC:"BAHLSEN 饼干威化卷牛奶巧克力", VDR_IT_CD_ID:"6398", UPC_ID:7056921950.0,CPK_PRI_FLG:“真”,CPK_SRC:“PEF”, FCM_RGLT_TYP_CT:"FSV"P", CPK_P_ORIG_DSC:"", RGLN_EXCL_FLG:"假", BRND_TYP:"" }

谁能帮帮我?

提前致谢, 卡提克

【问题讨论】:

  • 看起来你有一个格式错误的 json 字符串,第二个异常告诉你。 FCM_RGLT_TYP_CT 键似乎有问题,因为有 3 个双引号,其中一个应该转义或删除

标签: c# asp.net-mvc-4 json.net special-characters


【解决方案1】:

这个 json 数据在哪里被序列化?在序列化过程中引号应该已经转义。

此 JSON 数据无效,如果您有权访问应用程序序列化此 json 数据,则应将其更改为转义字符串中的引号。 (通常所有库都会在序列化过程中自动执行此操作)

更新

您好 Karthik,请参阅以下代码以使用 newtonsoft 的库以 JSON 格式序列化对象。

公共部分类 Form1 : Form { 公共表格1() { 初始化组件(); }

    private void button1_Click(object sender, EventArgs e)
    {
        var d = new DoTheWork();
        d.SerializeSample();
    }
}


public class Sample
{
    public string Id { get; set; }
    public string Description { get; set; }
}


public class DoTheWork
{

    public string SerializeSample()
    {
        List<Sample> sampleList = new List<Sample>();
        sampleList.Add(new Sample { Id = "1", Description = "Karthik" });
        sampleList.Add(new Sample { Id = "1", Description = "Sujit" });
        sampleList.Add(new Sample { Id = "1", Description = "John\"s" });

        StringBuilder sb = new StringBuilder();
        using (StringWriter sw = new StringWriter(sb))
        {
            JsonSerializer serializer = new JsonSerializer();
            serializer.Serialize(sw, sampleList);

        }
        System.Diagnostics.Debug.Write(sb.ToString());
        return sb.ToString();
    }
}

【讨论】:

  • 以上 JSON 数据没有使用任何序列化方法进行序列化,而是在 VIEW 端手动形成。你能帮我如何用引号形成 JSON 数据吗?例如:DESC:8" 圆桌会议
【解决方案2】:

您使用的 JSON 无效,并且不知道 FCMCasepackVM 的容器对象以及您如何获得 JSON,很难判断哪里出了问题。这是一个使用内置 System.Web.Script.Serialization 技术和 JavaScriptSerializer 的简单示例。

public class POC
{
  public int Id { get; set; }
  public string Desc { get; set; }
}

static List<POC> GetPOCOs()
{
  return new List<POC>
  {
      new POC { Id = 1, Desc = "John"},
      new POC { Id = 2, Desc = "Jane" },
      new POC { Id = 3, Desc = "Joey" }
  };
}

static void Main(string[] args)
{
  var pocos = GetPOCOs();

  var serializer = new JavaScriptSerializer();
  var sjson = serializer.Serialize(pocos);
  var djson = serializer.Deserialize<List<POC>>(sjson);

  Console.ReadLine();
}

当我在文本中序列化为 JSON 时,它应该如下所示:

[{"Id":1,"Desc":"John"},{"Id":2,"Desc":"Jane"},{"Id":3,"Desc":"Joey"}]

或者单个项目可能是:

{"Id":1,"Desc":"John"}

不是:

{Id:1,Desc:"John"}

通常,密钥对系统都是 JSON,但它需要用引号括起来的密钥才能知道它是什么。如果您有任何疑问,请使用在线 JSON 验证器,例如 http://jsonlint.com/

【讨论】:

  • 对不起!!我的错误是没有提供关于我的班级的完整细节。我的问题是,不是将对象序列化为 JSON,而是如何用引号手动形成 JSON 字符串。我以您的 JSON 数据为例,该数据非常简洁且易于反序列化为源对象 [{"Id":1,"Desc":"John"},{"Id":2,"Desc": "Jane"},{"Id":3,"Desc":"Joey"}] 下面一个怎么样? [{"Id":1,"Desc":"Joh"n"},{"Id":2,"Desc":"Jane"},{"Id":3,"Desc":"Joey"} ]
  • 您不应该手动为 JSON、XML 或二进制序列化任何内容。只需使用内置的.NET。如果你走手动做事的道路,你可能会得到许多无效的元素和语法。如果您想在字符串中添加双引号,只需对其进行转义 \" 然后对其进行序列化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-28
  • 2012-03-16
相关资源
最近更新 更多