67379


機器との通信で、定期的に送信されるJSON形式のデータを複数受信した場合（{...}{...}{...}のような場合）、それらを分割したい。（{...}と{...}と{...}に分割）

言語はC#で、JsonSerializerを使用しています。  
複数のJSON形式のデータをJsonSerializerに渡すと例外が出てしまいます。  
事前に分割するか、JsonSerializer自体にその機能があるかなど、何かいい方法があればご教授お願い致します。


CC BY-SA 4.0
2020-06-06T15:47:30.407
67371
2020-06-07T00:22:37.180
34135
question
c# json
JSONの形式で受信した複数のデータを分割したい


この記事の回答からの類推で、`}{`と言う文字列を置き換える処理で出来るのでは？

[How to parse multiple JSON arrays using
JSON.parse()?](https://stackoverflow.com/q/54415566/9014308)  
質問の冒頭：

> I am getting records from db and creating an array for each row and encoding
> it using `json_encode()`. Now, my data is returned as follows :
> `[{"slug":"bitcoin","change7d":"-3.87"}][{"slug":"maker","change7d":"-8.58"}]`.

回答：

> After a lot of researching, I managed to solve the issue by simply doing
> this:
[code]

>     var old = JSON.stringify(result).replace(/\]\[/g, ",");
>     var newData = JSON.parse(old);
>  
>     console.log(newData);
>  
[/code]

>
> It replaces all the occurrence of '][' with ',' hence converting the
> response data as Valid JSON.  
>  and it gives the intended result.
>
> `][`の出現箇所をすべて `,`に置き換えるため、応答データは有効なJSONとして変換されます。

* * *

keyやvalueの中に文字列として`}{`が含まれないという条件が満たされれば、いったん通常は現れない何かのデータを`}{`の間に追加して、今度はそれを基に分割するという、以下のような処理で出来るでしょう。  
`data`に受信した文字列が格納されているものとします。

[code]

    string[] jsons = data.Replace("}{", "}\x1f{").Split("\x1f");
    
[/code]

配列に分割された文字列を1個づつJsonSerializerに渡せば処理できるでしょう。

* * *

ちなみに以下記事回答にこんなコメントがあってUpvoteされているので、普通のパーサーは質問のようなデータを許容しないのだと思われます。  
[What does "JSON standard only allows one top level
value"?](https://stackoverflow.com/q/45625903/9014308)

> That's odd. Most parsers are designed to handle only one top level object
> per file, be it a list or a dictionary. If it handles multiple {} objects,
> those objects must be subset of another object.
>
> それは変だ。 ほとんどのパーサーは、リストであろうと辞書であろうと、ファイルごとに1つの最上位オブジェクトのみを処理するように設計されています。
> 複数の{}オブジェクトを処理する場合、それらのオブジェクトは別のオブジェクトのサブセットである必要があります。


CC BY-SA 4.0
2020-06-07T00:05:41.407
67379
2020-06-07T00:22:37.180
2020-06-17T08:14:45.997
-1
26370
67371
answer