如何从python脚本中收到的服务总线队列中删除@ strin3http // schemas.microsoft.com / 2003/10 / Serialization /??

时间:2016-03-30 11:41:41

标签: c# python json azure serialization

我已将Azure流分析作业的输出设置为服务总线队列,该队列以JSON序列化格式发送数据。当我收到python脚本中的队列消息,以及大括号中的数据时,我得到@ strin3http // schemas.microsoft.com / 2003/10 /序列化/ in在前面。我无法修剪它,因为收到的消息未被识别为字符串或消息。因此,我无法对数据进行反序列化。

4 个答案:

答案 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_messageread_delete_queue_message_create_message,我认为您可以直接删除{{1}中的多余内容使用字符串common function lstripstrip

答案 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; }

    }