【问题标题】:NewtonSoft JSON converter serializes but does it weirdly. How to fix?NewtonSoft JSON 转换器会序列化,但做起来很奇怪。怎么修?
【发布时间】:2023-03-05 22:34:01
【问题描述】:

给定以下对象

Friend Class GetLocationsResult
    Public Property X1 As String
    Public Property X2 As String
    Public Property X3 As String
    Public Property X4 As String
    Public Property X5 As String
    Public Property X6 As Double
    Public Property X7 As Double
End Class

它是这样声明和实例化的:

Dim objList as List(of GetLocationsResults) = new List(of GetLocationsResults)

而 objList 是通过一个迭代器填充的,该迭代器通过对象/聚合类的集合搅动。迭代器只是将值推入一个新的 GetLocationsResult 对象,然后将其添加到列表中。

并给出 NewtonSoft JSONConvert.SerializeObject(objList) 结果:

{"d":"[{\"X1\":\"Store Name\",\"X2\":\"Address\",\"X3\":\"City\",\"X4\":\"State\",\"X5\":\"Zip\",\"X6\":Coord1,\"X7\":Coord2}]"}

这一点已得到解决,不再是问题

这个结果集有几个问题。首先,对于任何奇怪的 原因,被命名为"d" 的对象是不可接受的。

  1. 如何为 json 数组的“名称”指定 "d" 以外的其他内容?

当我尝试JSON.parse 响应时,它需要采用以下格式才能实际获取数据:

resultSet = JSON.parse(data.d);
console.warn(resultSet[0].X1);

不得不说resultSet[0]当然是不可接受的。

  1. 如何使“JSONConvert.Serialize”方法不以必须引用第一个索引的方式包装响应 生成的 JSON 数据,以便我可以说 resultSet.X1 而不是 resultSet[0].X1?

根据要求,这里提供了一些可能与当前问题相关的更详细信息。

正在从 WCF 服务返回数据。暴露的方法是这样装饰的:

<WebInvoke(Method:="GET", ResponseFormat:=WebMessageFormat.Json)>

并返回类型String。桌面应用程序和移动平台正在使用该服务。桌面网站可以有自己的方法,事实上,这样做是因为我们不想处理 X1、X2 等,而移动平台开发人员已声明这是必要的。如前所述,该方法以自定义聚合类的形式返回多个结果,然后将其推入一个类对象,该类对象只是一个属性的集合。因此返回语句是:

Return JsonConvert.SerializeObject(retVal)

其中 retVal 是一个 List(of GetLocationsResult)

因此,虽然必须通过索引访问数据对于网站来说可能很好,但对于移动平台来说是不可接受的。因为每个人都将运行自己的方法,所以如果需要,可以为两者提供一个独特的解决方案。

【问题讨论】:

  • 发布 GetLocationsResultObject 对象。虽然可以从问题中推断出修复,但发布对象将有助于确认。
  • 那将是最顶部的Friend Class GetLocationsResult 对象,第一个代码块。 :)
  • {"d":"[... 没有关闭]
  • 我已经更正了 json 括号、大括号和引号。感谢您指出这一点。
  • 这并不奇怪或奇怪,只是现代的 json。该格式防止恶意执行,解释见this

标签: javascript jquery json vb.net json.net


【解决方案1】:

三件事。

  1. 听起来您正在通过 ASP.NET ASMX 将其返回 ScriptService 或 ASPX [WebMethod]。当使用其中之一时 端点,you don't need to (and shouldn't) manually serialize the object into JSON。 ASP.NET 会自动为你做这件事。您根本不需要使用 JSONConvert;只需返回您的对象作为结果。这就是您在.d 之后看到所有转义数据的原因。它被 JSON 序列化了两次。

  2. 正如 WhiteHat 提到的,.d 在某些情况下是件好事。它在这些 ASP.NET JSON 服务中默认引入,不能在服务器端轻松删除,但在客户端解析响应时很容易解决。

  3. 您正在返回一个 List(of GetLocationResults),它映射到一个 JavaScript 数组。这就是为什么您需要使用resultSet[0].X1 来访问结果中的值。如果您想通过 resultSet.X1 访问该值,您需要确保只返回一个 GetLocationResults 对象而不是它们的列表。

这有帮助吗?如果您可以使用更完整的服务器端和客户端代码示例来更新您的问题,我可以给您一个如何解决上述三个问题的示例。

【讨论】:

  • 我已经为您添加了更多可能会有所帮助的信息。 GetLocationsResults 对象只是一个类对象,newtonsoft jsonconvert.serializeOjbect 很好地将它变成了一个数组,事实上,这就是它这样做的原因。看看添加的信息是否有帮助。谢谢。
  • 在仔细查看移动需求(见编辑)之后,他们将不得不处理该索引。事实证明,我不需要 JSONConvert 响应,只需返回列表(对象),它就会为我转换为 json。上次我记得在 Web 服务中使用 JSOn 时,您必须转换并执行此操作,而现在您突然返回您的对象并且 poof 它会自动处理。谢谢。
  • @MetalPhoenix:没错。直接返回对象是正确的方法(有关原因的更多信息,请参见我的答案中的链接)。
猜你喜欢
  • 2020-08-20
  • 2022-06-27
  • 2021-04-05
  • 1970-01-01
  • 2015-12-07
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 1970-01-01
相关资源
最近更新 更多