如何将这个Unicode转换为字典?

3

非常抱歉,我完全忘记提到我在使用Python。让我再试一次。

我正在使用Python来调用一个返回以下JSON的web服务:

{
  "results" : [
    {
      "paramName" : "output",
      "dataType" : "GPString",
      "value" : "{'city': 'Falls Church', 'isRuralArea': False, 'zip': '22046', 'isNotInBTOPLMArea': True, 'longitude': '-77.186180', 'isGeocodable': True, 'county': u'Falls Church', 'isNotInBIPLMArea': True, 'state': 'VA', 'isLatLongInUSBounds': True, 'address': '604 Jackson St', 'latitude': '38.884937'}"
    }
  ],
  "messages" : [

  ]
}

以下是我提取/解析代码中的重要片段:

import urllib
import httplib2
import json
import simplejson
http = httplib2.Http()

headers, response = http.request(url, 'GET')    

if headers['status'] == "200":

    responseAsJson = simplejson.loads(response)

    print "response = " + repr(responseAsJson)
    results = responseAsJson['results'][0]['value']

不幸的是,这给我留下了以下结果的值(如PyScripter调试器的变量窗口中所报告的):

u"{'city': 'Falls Church', 'isRuralArea': False, 'zip': '22046', 'isNotInBTOPLMArea': True, 'longitude': '-77.186180', 'isGeocodable': True, 'county': u'Falls Church', 'isNotInBIPLMArea': True, 'state': 'VA', 'isLatLongInUSBounds': True, 'address': '604 Jackson St', 'latitude': '38.884937'}"

我不知道如何访问地址城市等键。

你能告诉我哪里出了问题,以及如何解决吗?

谢谢, 杰米


我的旧问题(已过时):

这是我正在解析的JSON:

response = {u'messages': [], u'results': [{u'dataType': u'GPString', u'value': u"{'city': 'Falls Church', 'isRuralArea': False, 'zip': '22046', 'isNotInBTOPLMArea': True, 'longitude': '-77.186180', 'isGeocodable': True, 'county': u'Falls Church', 'isNotInBIPLMArea': True, 'state': 'VA', 'isLatLongInUSBounds': True, 'address': '604 Jackson St', 'latitude': '38.884937'}", u'paramName': u'output'}]}

我已经深入到这个节点,它的类型是“unicode”。我该如何将其转换为字典?我认为它是Unicode类型阻止了我创建字典或访问它的键,但我不确定。
u"{'city': 'Falls Church', 'isRuralArea': False, 'zip': '22046', 'isNotInBTOPLMArea': True, 'longitude': '-77.186180', 'isGeocodable': True, 'county': u'Falls Church', 'isNotInBIPLMArea': True, 'state': 'VA', 'isLatLongInUSBounds': True, 'address': '604 Jackson St', 'latitude': '38.884937'}"

感谢您,Jamie。

这不是一个合法的JSON字符串。我怀疑你使用了标签列表中未包含的语言。你正在开发什么?使用什么DBMS? - Jonathan M
我创建了一个服务(在ArcGIS地理处理服务中),它返回一些看起来很不错的JSON: {"results":[{"paramName":"output","dataType":"GPString","value":"{'city': 'Falls Church', 'isRuralArea': False, 'zip': '22046', 'isNotInBTOPLMArea': True, 'longitude': '-77.186180', 'isGeocodable': True, 'county': u'Falls Church', 'isNotInBIPLMArea': True, 'state': 'VA', 'isLatLongInUSBounds': True, 'address': '604 Jackson St', 'latitude': '38.884937'}"}],"messages":[]}我使用 headers, response = http.request(url, 'GET') 然后 responseAsJson = simplejson.loads(response) 获取它。 - Jamie Jackson
是的,服务返回的JSON是合法的,但你原始帖子中的JSON不是。如果你把每个属性名前面的u去掉,它就是合法的。 - Jonathan M
是的,抱歉,我的评论有些草率。我还在中间...然后,我执行以下操作,这会给出我提到的“unicode”:results = responseAsJson['results'][0]['value']你看出我做错了什么吗? - Jamie Jackson
请发布您的代码。使用什么语言?Javascript? - Jonathan M
2个回答

2

由于您的results对象看起来像是字典的字符串/Unicode版本,因此您需要对其进行评估。在Python 2.6中,一种安全的方法是使用ast.literal_eval函数:

results = ast.literal_eval(responseAsJson['results'][0]['value'])

是的,这个可行,谢谢!在评估后,results 变成了一个字典。 - Jamie Jackson
2
你不应该这样做。你应该修复服务器中的JSON导出器。 - jterrace
嗨,jterrace,你会发现(在我原始帖子的第一个代码块中)服务器返回了正确的JSON。直到我开始在Python中解析东西,我才得到Python字典的unicode表示。我仍然不确定为什么会发生这种情况,但它绝对是在客户端而不是服务器端发生的。 - Jamie Jackson

0

这并不是一个完整的答案,因为很难确定你想要什么。但是一个开始的地方是纠正JSON字符串。

以下是您可能需要的JSON格式:

{'messages': [], 'results': [{'dataType': 'GPString', 'value': {'city': 'Falls Church', 'isRuralArea': False, 'zip': '22046', 'isNotInBTOPLMArea': True, 'longitude': '-77.186180', 'isGeocodable': True, 'county': 'Falls Church', 'isNotInBIPLMArea': True, 'state': 'VA', 'isLatLongInUSBounds': True, 'address': '604 Jackson St', 'latitude': '38.884937'}, 'paramName': 'output'}]}

我从几个属性名称的前面删除了u,并从第一个名为'value'的属性周围删除了"

现在,关于您最初的问题,我们需要更多细节。请发布您的代码以及您使用的语言/平台是什么?根据您在评论中提到的responseAsJson(),您是否正在使用ASP.NET的RadAjax?http://www.telerik.com/help/aspnet/ajax/ajxsimplewebserviceinvocation.html

请不要在此处回复,而是将其编辑到您的帖子中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接