如何解析以字符'u'开头的JSON字符串

时间:2019-10-11 17:55:56

标签: ruby-on-rails json ruby

我有一个要解析的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吗?

2 个答案:

答案 0 :(得分: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参考:

答案 1 :(得分:0)

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

真的。