繁体   English   中英

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

[英]In c# how to split json objects into smaller objects and store in a string array

我必须以 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 元组。 像上面应该分开为2个字符串数组

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

[{"CombinationCode":129,"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)));
}

任何帮助将不胜感激。

一种方法是将 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; }
}

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

看看: https : //www.newtonsoft.com/json

然后,像这样的事情。

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

以下代码进行了大量分配,但正是您想要的

    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 parts = JArray.Parse(json).Select(x => x.ToString(Formatting.None)).ToList();

现在,您可以对每个部分做任何想做的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM