【问题标题】:How can i parse a JSON String prefixed with the character 'u'如何解析以字符 'u' 为前缀的 JSON 字符串
【发布时间】:2019-10-11 17:55:56
【问题描述】:

我有一个我正在尝试解析的 JSON 字符串:

[{u'OrderItem': {u'OrderItemId': u'123456789', u'Title': u'Product Title', u'QuantityShipped': u'0', u'IsTransparency': u'false', u'QuantityOrdered': u'1', u'ItemTax': {u'CurrencyCode': u'USD', u'Amount': u'0.00'}, u'ASIN': u'123456789', u'SellerSKU': u'BBB-123456789', u'ConditionSubtypeId': u'New', u'ConditionId': u'New', u'PromotionDiscountTax': {u'CurrencyCode': u'USD', u'Amount': u'0.00'}, u'TaxCollection': {u'Model': u'MarketplaceFacilitator', u'ResponsibleParty': u'Random Services, Inc.'}, u'PromotionDiscount': {u'CurrencyCode': u'USD', u'Amount': u'0.00'}, u'ItemPrice': {u'CurrencyCode': u'USD', u'Amount': u'100.35'}, u'ProductInfo': {u'NumberOfItems': u'1'}, u'IsGift': u'false'}}]

我不知道为什么,但是 JSON 的每个部分都以字母“u”为前缀,我不确定我能做些什么来解析它。

我在网上看到,在 python 中这是正常的,但在 rails 中我只是得到一个错误,有什么方法可以将它解析成 JSON?

【问题讨论】:

  • 可以先去掉u,再解析?
  • 删除 us 仍然不会产生有效的 JSON。 JSON 不允许单引号。您从哪里获得这些数据?
  • @ricks 我会说你应该 gsub {u'\su'(空格 + u),否则如果字符串以 u 结尾,它将删除它。如果文档没有双引号,我认为我所描述的方法是安全的,因为' 永远不会出现在字符串中,它需要被转义\'跨度>
  • .gsub("'",'"') 虽然有点冒险。如果字符串包含" 字符怎么办?
  • @max 我向他们的支持发送了同样的问题

标签: ruby-on-rails json ruby


【解决方案1】:

如果可能,我会检查 webhook 提供的数据是否可以配置为正确的 JSON。 如果不能,我会让 Python 将字符串转换为 JSON,因为你说这是可读的。

我没有使用 Python 的经验,所以可能有更好的方法来做这件事,但这样的事情可以解决问题:

# to_json.py
import sys
import ast
import json

input  = sys.stdin.read().strip()
output = ''

if input:
    object = ast.literal_eval(input)
    output = json.dumps(object)

print(output)

现在在 Ruby 中,您可以执行以下操作:

require 'json' # not needed in Rails

string = "[{u'OrderItem': {u'OrderItemId': u'123456789', u'Title': u'Product Title', u'QuantityShipped': u'0', u'IsTransparency': u'false', u'QuantityOrdered': u'1', u'ItemTax': {u'CurrencyCode': u'USD', u'Amount': u'0.00'}, u'ASIN': u'123456789', u'SellerSKU': u'BBB-123456789', u'ConditionSubtypeId': u'New', u'ConditionId': u'New', u'PromotionDiscountTax': {u'CurrencyCode': u'USD', u'Amount': u'0.00'}, u'TaxCollection': {u'Model': u'MarketplaceFacilitator', u'ResponsibleParty': u'Random Services, Inc.'}, u'PromotionDiscount': {u'CurrencyCode': u'USD', u'Amount': u'0.00'}, u'ItemPrice': {u'CurrencyCode': u'USD', u'Amount': u'100.35'}, u'ProductInfo': {u'NumberOfItems': u'1'}, u'IsGift': u'false'}}]"

json = IO.popen('python to_json.py', 'r+') do |io|
  io.puts(string)
  io.close_write # closing write sends EOF, signalling the end of input
  io.read
end

JSON.parse(json)
#=> [{"OrderItem"=>{"ASIN"=>"123456789", "ConditionId"=>"New", "OrderItemId"=>"123456789", "Title"=>"Product Title", "IsGift"=>"false", "ConditionSubtypeId"=>"New", "SellerSKU"=>"BBB-123456789", "PromotionDiscountTax"=>{"CurrencyCode"=>"USD", "Amount"=>"0.00"}, "TaxCollection"=>{"Model"=>"MarketplaceFacilitator", "ResponsibleParty"=>"Random Services, Inc."}, "PromotionDiscount"=>{"CurrencyCode"=>"USD", "Amount"=>"0.00"}, "ItemPrice"=>{"CurrencyCode"=>"USD", "Amount"=>"100.35"}, "ProductInfo"=>{"NumberOfItems"=>"1"}, "QuantityShipped"=>"0", "IsTransparency"=>"false", "QuantityOrdered"=>"1", "ItemTax"=>{"CurrencyCode"=>"USD", "Amount"=>"0.00"}}}]

注意:这假设您的机器上安装了 Python,并且您已将 Python 脚本与 Ruby 脚本放在同一工作目录中。

Python 参考资料:

Ruby 参考:

【讨论】:

    【解决方案2】:

    不要适应。使源修复其输出。

    真的。

    【讨论】:

    • 我联系了他们 (Zappier),但他们似乎不会修复它。我申请访问亚马逊卖家 API,所以我必须使用 Zappier 作为替代方案,直到我获得批准并且我不必处理这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    • 2019-05-30
    • 2015-01-13
    • 2011-01-28
    • 2014-03-27
    • 1970-01-01
    相关资源
    最近更新 更多