【问题标题】:Read nested array as whole with Utf8JsonReader使用 Utf8JsonReader 读取整个嵌套数组
【发布时间】:2019-10-23 07:00:20
【问题描述】:

我正在尝试使用 System.Text.JsonUtf8JsonReader 解析 GeoJSON 几何定义。
我的问题是几何定义的coordinates 属性可能位于type 的定义之前。 coordinates可以

  • 一个普通的双精度数组 ([0, 1]),用于 Point 类型的几何,
  • 用于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 解析它?

【问题讨论】:

  • 请添加一些代码,以便有人知道您正在做什么。

标签: .net json geojson system.text.json


【解决方案1】:

我通过使用以下函数实现了我喜欢做的事情

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

【讨论】:

  • ReadToken 不是 Utf8JsonReader 上可用的方法
  • 对,就是这个extension method
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-20
  • 1970-01-01
  • 2021-04-29
  • 2014-12-21
  • 2015-07-08
  • 2015-03-17
相关资源
最近更新 更多