【问题标题】:DataContractJsonSerializer treats some values incorrectlyDataContractJsonSerializer 不正确地处理某些值
【发布时间】:2016-02-26 10:54:53
【问题描述】:

我遇到了奇怪的问题。下面你可以看到我的测试代码

[DataContract]
public class Test
{
    [DataMember]
    public string Name { get; set; }
}
private static void Main(string[] args)
{
    MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes("{ \"Name\" :   Isometext  }"));
    var s = new DataContractJsonSerializer(typeof(Test));
    var r = (Test)s.ReadObject(ms);
    Console.WriteLine(r.Name);
}

name = Isometext - 好的

name = Tsometext -Exception

name = Nsometext - 好的

name = sometext - 例外

name = nsometext - 例外

为什么 DataContractJsonSerializer 将以大写 IN 开头的值视为正确值?是bug吗?

【问题讨论】:

  • 似乎是一个无效的 json 字符串。您是否尝试将 sometext 字符串用双引号括起来,例如 "{ \"Name\" : \"sometext\" }"
  • 是否必须使用DataContractJsonSerializer?我知道这个问题与您提出的问题无关。但是我仍然很好奇,当 Newtonsoft.Json 可以为您提供更好的性能时,您为什么要使用 DataContractJsonSerializer。
  • 仅适用于UTF8
  • @Krishna Kumar N,这个序列化器用于 wcf 并将其更改为 Newtonsoft.Json 并不简单。但是是的,我需要更改它

标签: c# json wcf datacontractjsonserializer


【解决方案1】:

哇,进一步挖掘它让我here

由于您没有用双引号括起 IsometextDataContractJsonSerializer 将其视为数字格式,似乎可以考虑

N 代表 NaN

我代表无限

而且,NewtonSoft.JSON 似乎比 DataContractJsonSerializer 处理得更好。见http://www.newtonsoft.com/json/help/html/JsonNetVsDotNetSerializers.htm

【讨论】:

  • 你是对的,但是如果我们传递 Nsometext,这是不正确的 json 格式?
  • 是的,这是不正确的。 DataContractJsonSerializer 似乎将 Nsometext 视为 NaN
【解决方案2】:

不知道为什么大写和非大写的行为不同,但要修复它,您需要将字符串值包含在 "" 中,例如 \"isotext\"。

【讨论】:

  • 这不是转义。您只是将此值转换为字符串文字
  • 您不能只是对 json 规范做出自己的解释并期望它能够工作。 json 中的字符串需要用引号括起来。来自 json 规范“字符串是零个或多个 Unicode 字符的序列,用双引号括起来,使用反斜杠转义。字符表示为单个字符串。字符串非常像 C 或 Java 字符串。”
  • 是的,我们没有用引号括起来,它应该抛出异常,但是对于某些值(参见我的问题中的示例),不会抛出异常。这是一个问题
  • 我假设它 trying 将您的大写值作为字符串处理以容忍传入的数据,但在内部使用某种形式的驼峰式大小写解析,然后尝试将其视为属性名称,因此会引发错误。
  • 很想知道为什么使用“I”和“N”有效,但是为什么不简单地使用引号解决这个问题,因为“Name”是一个字符串,正如@SimonHardy 所建议的那样?如果 Name 有中间名,则需要用引号括起来,否则您的 json 会因空格而出错。这是 DataContractJsonSerializer 的一种奇怪行为,但是您的字符串无论如何都缺少引号。
猜你喜欢
  • 1970-01-01
  • 2019-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多