我已将Azure流分析作业的输出设置为服务总线队列,该队列以JSON序列化格式发送数据。当我收到python脚本中的队列消息,以及大括号中的数据时,我得到@ strin3http // schemas.microsoft.com / 2003/10 /序列化/ in在前面。我无法修剪它,因为收到的消息未被识别为字符串或消息。因此,我无法对数据进行反序列化。
答案 0 :(得分:1)
该问题类似于SO线程Interoperability Azure Service Bus Message Queue Messages。
根据我的经验,从Azure Stream Analytics到Service Bus的数据是通过AMQP协议发送的,但是在Python中接收数据的协议是HTTP。过量的内容是由AMQP在传播过程中产生的。
假设通过以下代码接收消息,请参阅https://azure.microsoft.com/en-us/documentation/articles/service-bus-python-how-to-use-queues/#receive-messages-from-a-queue。参数receive_queue_message
的{{1}}值函数False
包含了REST API Receive and Delete Message (Destructive Read)。
peek_lock
根据Azure Service Bus SDK for Python的源代码包括函数receive_queue_message
,read_delete_queue_message
和_create_message
,我认为您可以直接删除{{1}中的多余内容使用字符串common function lstrip
或strip
。
答案 1 :(得分:1)
我也遇到了这个问题。以前的答案只是解决方法,并没有解决此问题的根本原因。您遇到的问题可能是由于您的Stream Analytics兼容级别。兼容级别1.0使用XML序列化程序生成您看到的XML标记。兼容性级别1.1"修复"这个问题。
请在此处查看我之前的回答:https://stackoverflow.com/a/49307178/263139。
答案 2 :(得分:0)
This TechNet article建议使用以下代码:
// Get indices of actual message
var start = jsonString.IndexOf("{");
var end = jsonString.LastIndexOf("}") + 1;
var length = end - start;
// Get actual message
string cleandJsonString = jsonString.Substring(start, length);
非常原始,但无论如何,我想......
答案 3 :(得分:0)
我有同样的问题,但是在.net解决方案中。我正在编写一个将数据发送到队列的服务,另一方面,我正在编写一个从队列中获取数据的服务。我尝试发送JSON,如下所示:
var documentMessage = new DocumentMessage();
var json = JsonConvert.SerializeObject(documentMessage);
BrokeredMessage message = new BrokeredMessage(json);
await _client.SendAsync(message);
在第二项服务中,我获取了JSON,但带有以下前缀:
@ strin3http // schemas.microsoft.com / 2003/10 / Serialization /.
我通过添加 DataContractJsonSerializer 来解决此问题,
var documentMessage = new DocumentMessage();
var serializer = new DataContractJsonSerializer(typeof(DocumentMessage));
BrokeredMessage message = new BrokeredMessage(documentMessage , serializer);
await _client.SendAsync(message);
如果要以这种方式解决问题,则必须将 System.Runtime.Serialization 的数据属性添加到模型:
[DataContract]
public class DocumentMessage
{
[DataMember]
public string Property1 { get; private set; }
[DataMember]
public string Property2 { get; private set; }
}