我正在批处理序列化的记录(在JArray中)以发送到事件中心。当我将数据写入Event Hubs时,似乎在JSON周围插入了额外的语音标记,即写为"{"myjson":"blah"}"而不是{"myjson":"blah"}的内容,所以在下游我很难读取它。

基于此guidance,我必须将JSON转换为字符串,然后使用GetBytes将其传递到EventData对象。我怀疑出现此问题是我遵循本指南的尝试。

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
public static class EventDataTransform
{
    public static EventData ToEventData(dynamic eventObject, out int payloadSize)
    {
        string json = eventObject.ToString(Formatting.None);
        payloadSize = Encoding.UTF8.GetByteCount(json);
        var payload = Encoding.UTF8.GetBytes(json);
        var eventData = new EventData(payload)
        {
        };
        return eventData;
    }
}


如何将JArray中包含序列化数据的项目转换为EventData消息的内容?



代码调用位置-用于批量处理多达256kb的包裹

public bool MoveNext()
{
        var batch = new List<EventData>(_allEvents.Count);
        var batchSize = 0;
        for (int i = _lastBatchedEventIndex; i < _allEvents.Count; i++)
        {
            dynamic evt = _allEvents[i];
            int payloadSize = 0;
            var eventData = EventDataTransform.ToEventData(evt, out payloadSize);
            var eventSize = payloadSize + EventDataOverheadBytes;
            if (batchSize + eventSize > MaxBatchSizeBytes)
            {
                break;
            }

            batch.Add(eventData);
            batchSize += eventSize;
        }
        _lastBatchedEventIndex += batch.Count();
        _currentBatch = batch;
        return _currentBatch.Count() > 0;
}

最佳答案

听起来JArray已经包含序列化的对象(字符串)。调用.ToString(Formatting.None)将再次对其进行序列化(用引号引起来)。

有趣的是,如果在不传递.ToString()的情况下调用Formatting,它将不会再次对其进行序列化。

这个小提琴演示了这一点:https://dotnetfiddle.net/H4p6KL

关于c# - 如何将JSON正确写入事件中心,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39126042/

10-10 15:51