0

我正在尝试使用System.Text.Json's解析 GeoJSON 几何定义Utf8JsonReader
我的问题是coordinates几何定义的属性可能位于type. coordinates

  • 一个普通的双精度数组 ( [0, 1]) 用于几何类型Point
  • [[0,1],[2,3]]用于几何类型的双精度数组 ( ) 的数组LineString
  • 一个双精度数组 ( [[[0,0],[10,0],[10,10],[0,0]],[[1,1],[9,9],[1,9],[1,1]]])的数组,用于Polygon带有孔甚至是
  • 上述几何类型的数组MultiPolygon


因此,coordinates如果我不知道type.
有没有办法将其整体阅读并稍后使用解析Utf8JsonReader

4

1 回答 1

0

通过使用以下功能,我实现了我喜欢做的事情

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());
}

于 2019-10-24T10:17:59.830 回答