C# 如何将JSON正确写入事件中心

C# 如何将JSON正确写入事件中心,c#,json,azure,json.net,azure-eventhub,C#,Json,Azure,Json.net,Azure Eventhub,我正在批处理序列化记录(在JArray中)以发送到事件中心。当我将数据写入事件集线器时,它似乎在JSON周围插入了额外的语音标记,即写入的内容“{”myjson:“blah”}”而不是{”myjson:“blah”},因此下游我在阅读它时遇到了问题 基于此,我必须将JSON转换为字符串,然后使用GetBytes将其传递到EventData对象中。我怀疑我试图遵循这一指导是我的问题所在 using Newtonsoft.Json; using Newtonsoft.Json.Linq; publi

我正在批处理序列化记录(在JArray中)以发送到事件中心。当我将数据写入事件集线器时,它似乎在JSON周围插入了额外的语音标记,即写入的内容
“{”myjson:“blah”}”
而不是
{”myjson:“blah”}
,因此下游我在阅读它时遇到了问题

基于此,我必须将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;
}
public bool MoveNext()
{
var batch=新列表(_allEvents.Count);
var-batchSize=0;
for(int i=\u lastBatchedEventIndex;i<\u allEvents.Count;i++)
{
动态evt=_allEvents[i];
int payloadSize=0;
var eventData=EventDataTransform.ToEventData(evt,out payloadSize);
var eventSize=payloadSize+EventDataOverheadBytes;
if(batchSize+eventSize>MaxBatchSizeBytes)
{
打破
}
batch.Add(事件数据);
batchSize+=eventSize;
}
_lastBatchedEventIndex+=batch.Count();
_当前批次=批次;
返回_currentBatch.Count()>0;
}

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

有趣的是,如果调用
.ToString()
而不传入
格式设置
,它将不会再次序列化它


这把小提琴演示了这一点:

如何调用
ToEventData()
?添加到问题中。我还研究了JArray是否是完整JSON文档FWIW数组的正确结构,或者其他对象是否更适合处理条目。