如何配置 class 定义以使用标记为 JSON 的 Unicode
How to configure class definition to consume Unicode marked JSON
如果我使用正则表达式函数删除 u'
,则会正确使用 JSON。 Newtonsoft 有没有办法在没有正则表达式预处理的情况下处理它?
我正在使用 VB.net 如果它有所作为。
这是一些上下文的片段:
{
"memo": [
"{u'braums': {u'printing_data': {u'customerFirstName': u'xxxxxx', u'orderNumber': 4495, u'customerLastName': u'xxxxxx', u'num_refrigerated_labels': 1, u'num_dry_labels': 1, u'packedBy': u'xxxxxxx xxxxxxx', u'pickupTime': u'11/18/2020 15:00', u'num_frozen_labels': 0}}}",
"{u'braums': {u'cancellation_reasons': {u'who': u'xxxxxxx', u'when': u'11/18/2020 8:02 PM', u'why': u'called to cancel'}}}"
]
}
根据@dbc 的建议,这里有一个显示问题的示例。
https://dotnetfiddle.net/pM1qs2
我扩展了他的 TestClass
,其中包含一个使用正则表达式删除 Unicode 标记的子项 (TestClass.ShowMemoWork()
),然后是一个保留 Unicode 标记的子项 (TestClass.ShowMemoIssue()
)
JObject
有效的事实,意味着我缺少语法中的某些内容。
据我所知,Json.Net 不支持在 JSON 中的字符串前面使用 u
前缀。这绝对不是 JSON 标准的一部分,如您所见 here。 \u
可以在 内部 字符串中用作 4 个十六进制数字字符串的前缀以表示 unicode 字符,但这与示例中的内容完全不同。
我认为您是被骗了,以为它与 JObject
一起“有效”,但在那种情况下您并没有真正进行相同的测试。在您的 ShowMemoIssue
示例中,您首先反序列化完整的 JSON (效果很好),然后尝试反序列化 memo
数组中的一个字符串。第二步失败,因为该字符串无效 JSON 由于 u
前缀。
但是你永远不会尝试使用 JObject
的第二步。你只反序列化外层的JSON然后打印出来,就称成功了。如果您尝试获取数组项之一并将其反序列化为 JObject
,您将看到它以同样的方式失败。这是一个演示:https://dotnetfiddle.net/W7XQpd
简而言之,我认为您将不得不继续使用正则表达式预处理来处理您的 JSON。更好的办法是更改 JSON 的发射器,使其首先不包含无效前缀,但我知道这可能不受您的控制。
如果我使用正则表达式函数删除 u'
,则会正确使用 JSON。 Newtonsoft 有没有办法在没有正则表达式预处理的情况下处理它?
我正在使用 VB.net 如果它有所作为。 这是一些上下文的片段:
{
"memo": [
"{u'braums': {u'printing_data': {u'customerFirstName': u'xxxxxx', u'orderNumber': 4495, u'customerLastName': u'xxxxxx', u'num_refrigerated_labels': 1, u'num_dry_labels': 1, u'packedBy': u'xxxxxxx xxxxxxx', u'pickupTime': u'11/18/2020 15:00', u'num_frozen_labels': 0}}}",
"{u'braums': {u'cancellation_reasons': {u'who': u'xxxxxxx', u'when': u'11/18/2020 8:02 PM', u'why': u'called to cancel'}}}"
]
}
根据@dbc 的建议,这里有一个显示问题的示例。 https://dotnetfiddle.net/pM1qs2
我扩展了他的 TestClass
,其中包含一个使用正则表达式删除 Unicode 标记的子项 (TestClass.ShowMemoWork()
),然后是一个保留 Unicode 标记的子项 (TestClass.ShowMemoIssue()
)
JObject
有效的事实,意味着我缺少语法中的某些内容。
据我所知,Json.Net 不支持在 JSON 中的字符串前面使用 u
前缀。这绝对不是 JSON 标准的一部分,如您所见 here。 \u
可以在 内部 字符串中用作 4 个十六进制数字字符串的前缀以表示 unicode 字符,但这与示例中的内容完全不同。
我认为您是被骗了,以为它与 JObject
一起“有效”,但在那种情况下您并没有真正进行相同的测试。在您的 ShowMemoIssue
示例中,您首先反序列化完整的 JSON (效果很好),然后尝试反序列化 memo
数组中的一个字符串。第二步失败,因为该字符串无效 JSON 由于 u
前缀。
但是你永远不会尝试使用 JObject
的第二步。你只反序列化外层的JSON然后打印出来,就称成功了。如果您尝试获取数组项之一并将其反序列化为 JObject
,您将看到它以同样的方式失败。这是一个演示:https://dotnetfiddle.net/W7XQpd
简而言之,我认为您将不得不继续使用正则表达式预处理来处理您的 JSON。更好的办法是更改 JSON 的发射器,使其首先不包含无效前缀,但我知道这可能不受您的控制。