在c#中,如何将json对象拆分为较小的对象并存储在字符串数组中

在c#中,如何将json对象拆分为较小的对象并存储在字符串数组中,c#,json,C#,Json,我必须以json格式发送数据,但它们必须是小尺寸的。我得到的数据(str)如下 [{"CombinationCode":127,"Pattern":"4545,.86,4520,.44,4592"},{"CombinationCode":128,"Pattern":"4545,.86,4520,.44,4592"},{"CombinationCode":129,"Pattern":"4545,.86,4520,.44,4592"}] 如果我希望最大大小为165,我希望将数据分块成小于165(m

我必须以json格式发送数据,但它们必须是小尺寸的。我得到的数据(str)如下

[{"CombinationCode":127,"Pattern":"4545,.86,4520,.44,4592"},{"CombinationCode":128,"Pattern":"4545,.86,4520,.44,4592"},{"CombinationCode":129,"Pattern":"4545,.86,4520,.44,4592"}]
如果我希望最大大小为165,我希望将数据分块成小于165(maxLength)的片段,并且应该包含一个完整的json元组。与上面一样,应该作为两个字符串数组分隔

 [{"CombinationCode":127,"Pattern":"4545,.86,4520,.44,4592"},{"CombinationCode":128,"Pattern":"4545,.86,4520,.44,4592"}]

我将如何做到这一点。我尝试了下面的代码,但它只根据大小而不是元组来分隔代码

for (int index = 0; index < str.Length; index += maxLength) {
    Console.WriteLine("DataPart {0}",str.Substring(index, Math.Min(maxLength, str.Length - index)));
}
for(int index=0;index

任何帮助都将不胜感激。

一种方法是将JSON反序列化到列表中并逐个发送:

List<DataToBeSent> items = JsonConvert.DeserializeObject<List<DataToBeSent>>(json);

foreach (var item in items)
{
    SendItemOverNetwork(JsonConvert.SerializeObject(item));
}


public class DataToBeSent
{
    public int CombinationCode { get; set; }
    public string Pattern { get; set; }
}
List items=JsonConvert.DeserializeObject(json);
foreach(项目中的var项目)
{
SendItemOverNetwork(JsonConvert.SerializeObject(item));
}
公共类DataToBeSent
{
公共int组合代码{get;set;}
公共字符串模式{get;set;}
}

为什么要重新发明使用JSON库解析JSON的方法

看看:

然后,像这样的事情

var items = JsonConvert.DeserializeObject<List<Dictionary<string, string>>(jsonString);
foreach(var dict in items)
{
    var jsonChunk = JsonConvert.SerializeObject(dict);
}

var items=JsonConvert.DeserializeObject下面的代码进行了大量分配,但执行的正是您想要的

    var input =
        "[{\"CombinationCode\":127,\"Pattern\":\"4545,.86,4520,.44,4592\"},{\"CombinationCode\":128,\"Pattern\":\"4545,.86,4520,.44,4592\"},{\"CombinationCode\":129,\"Pattern\":\"4545,.86,4520,.44,4592\"}]";

    var arr = JsonConvert.DeserializeObject<List<JToken>>(input);

    const int emptyArraySquareBracesCount = 2;
    const int charsBetweenElements = 1;

    var maxSize = 165;
    var buffer = new JArray();
    var bufferLength = emptyArraySquareBracesCount;
    var elementsInChunk = 0;

    foreach (var element in arr)
    {
        var part = element.ToString(Formatting.None);
        if (bufferLength + part.Length > maxSize)
        {
            Console.WriteLine(buffer.ToString(Formatting.None));
            buffer = new JArray();
            elementsInChunk = 1;
            bufferLength = emptyArraySquareBracesCount + part.Length;
            buffer.Add(element);
        }
        else
        {
            elementsInChunk++;
            bufferLength += charsBetweenElements + part.Length;
            buffer.Add(element);
        }
    }

    Console.WriteLine(buffer.ToString(Formatting.None));
var输入=
“[{\'CombinationCode\':127,\'Pattern\':\'4545,.864520,.444592\',{\'CombinationCode\':128,\'Pattern\':'4545,.864520,.444592\',{\'CombinationCode\':129,\'Pattern\':'4545,.864520,.444592\'”;
var arr=JsonConvert.DeserializeObject(输入);
const int EmptyArraySquareBraceScont=2;
元素之间的常量int字符=1;
var-maxSize=165;
var buffer=new JArray();
var bufferLength=EmptyArraySquareBraceScont;
var elementsInChunk=0;
foreach(arr中的var元素)
{
var part=element.ToString(格式化为.None);
if(缓冲长度+零件长度>最大尺寸)
{
Console.WriteLine(buffer.ToString(Formatting.None));
缓冲区=新的JArray();
elementsInChunk=1;
bufferLength=EmptyArraySquareBraceScont+零件长度;
buffer.Add(元素);
}
其他的
{
elementsInChunk++;
bufferLength+=元素之间的字符+部分长度;
buffer.Add(元素);
}
}
Console.WriteLine(buffer.ToString(Formatting.None));
我的方法是:

var parts = JArray.Parse(json).Select(x => x.ToString(Formatting.None)).ToList();

现在,您可以对每个部分执行任何操作。

是否希望分块字符串为有效的json,或者你只是想在反序列化/序列化之前将其拆分并放回一起?我希望分块的字符串是有效的jsonsIm不确定为什么你认为一次发送165字节比只发送整批数据更有效-除非总的数据包是巨大的,否则你的网络开销将很容易超过发送它的任何改进通过iothub,一次只发送小数据包最明智的做法是一次发送一个感谢您的回复,但我不想一个数据包一个数据包地发送,因为这样会很昂贵(我们希望减少发送到min的数据包数量)如果您想要分块的有效JSON,那么您必须反序列化它并逐个发送?或者你能再解释一下你的问题吗?
var parts = JArray.Parse(json).Select(x => x.ToString(Formatting.None)).ToList();