使用 Utf8JsonReader 整体读取嵌套数组
Read nested array as whole with Utf8JsonReader
我正在尝试使用 System.Text.Json
的 Utf8JsonReader
解析 GeoJSON 几何定义。
我的问题是几何定义的 coordinates
属性 可能位于 type
的定义之前。 coordinates
可以是
Point
、 类型几何的普通双精度数组 ([0, 1]
)
LineString
类型几何的双精度数组 ([[0,1],[2,3]]
) 的数组
- 双精度数组 (
[[[0,0],[10,0],[10,10],[0,0]],[[1,1],[9,9],[1,9],[1,1]]]
) 的数组,用于 Polygon
类型的几何体,有孔甚至
MultiPolygon
. 类型几何的上述数组
因此,如果我不知道 type
.
,我将无法正确解析 coordinates
属性
有没有办法整体读取它并稍后使用 Utf8JsonReader
?
解析它
我通过使用以下函数实现了我喜欢做的事情
private ReadOnlySpan<byte> ReadCoordinateData(ref Utf8JsonReader reader)
{
reader.ReadToken(JsonTokenType.StartArray);
var res = new MemoryStream();
res.Write(System.Text.Encoding.UTF8.GetBytes("["), 0, 1);
int openBrackets = 1;
bool wasCloseBracket = false;
bool addComma = false;
byte bytComma = System.Text.Encoding.UTF8.GetBytes(",")[0];
while (openBrackets > 0)
{
// add a comma to separate arrays
if (reader.TokenType == JsonTokenType.StartArray)
{
if (wasCloseBracket)
res.WriteByte(bytComma);
addComma = false;
openBrackets++;
}
if (reader.TokenType == JsonTokenType.Number && addComma)
res.WriteByte(bytComma);
byte[] seq = reader.HasValueSequence
? reader.ValueSequence.ToArray()
: reader.ValueSpan.ToArray();
res.Write(seq, 0, seq.Length);
addComma = reader.TokenType == JsonTokenType.Number;
if (reader.TokenType == JsonTokenType.EndArray)
{
openBrackets--;
addComma = false;
wasCloseBracket = true;
}
else
{
wasCloseBracket = false;
}
if (!reader.Read())
throw new JsonException();
}
return new ReadOnlySpan<byte>(res.ToArray());
}
我正在尝试使用 System.Text.Json
的 Utf8JsonReader
解析 GeoJSON 几何定义。
我的问题是几何定义的 coordinates
属性 可能位于 type
的定义之前。 coordinates
可以是
Point
、 类型几何的普通双精度数组 (LineString
类型几何的双精度数组 (- 双精度数组 (
[[[0,0],[10,0],[10,10],[0,0]],[[1,1],[9,9],[1,9],[1,1]]]
) 的数组,用于Polygon
类型的几何体,有孔甚至 MultiPolygon
. 类型几何的上述数组
[0, 1]
)
[[0,1],[2,3]]
) 的数组
因此,如果我不知道 type
.
,我将无法正确解析 coordinates
属性
有没有办法整体读取它并稍后使用 Utf8JsonReader
?
我通过使用以下函数实现了我喜欢做的事情
private ReadOnlySpan<byte> ReadCoordinateData(ref Utf8JsonReader reader)
{
reader.ReadToken(JsonTokenType.StartArray);
var res = new MemoryStream();
res.Write(System.Text.Encoding.UTF8.GetBytes("["), 0, 1);
int openBrackets = 1;
bool wasCloseBracket = false;
bool addComma = false;
byte bytComma = System.Text.Encoding.UTF8.GetBytes(",")[0];
while (openBrackets > 0)
{
// add a comma to separate arrays
if (reader.TokenType == JsonTokenType.StartArray)
{
if (wasCloseBracket)
res.WriteByte(bytComma);
addComma = false;
openBrackets++;
}
if (reader.TokenType == JsonTokenType.Number && addComma)
res.WriteByte(bytComma);
byte[] seq = reader.HasValueSequence
? reader.ValueSequence.ToArray()
: reader.ValueSpan.ToArray();
res.Write(seq, 0, seq.Length);
addComma = reader.TokenType == JsonTokenType.Number;
if (reader.TokenType == JsonTokenType.EndArray)
{
openBrackets--;
addComma = false;
wasCloseBracket = true;
}
else
{
wasCloseBracket = false;
}
if (!reader.Read())
throw new JsonException();
}
return new ReadOnlySpan<byte>(res.ToArray());
}