使用Newtonsoft JSON进行自定义序列化的问题

时间:2017-07-03 20:28:21

标签: c# json json.net

为了提高性能,我尝试将自定义序列化程序与Newtonsoft JSON一起使用,但由于某种原因,该函数随机停止,调用序列化程序的函数也会结束。 没有例外,因此我无法确定原因。这是函数:

    public string customSerialize(List<EntityJSON> data)
    {
        StringBuilder sb = new StringBuilder();
        StringWriter sw = new StringWriter(sb);
        JsonTextWriter writer = new JsonTextWriter(sw);
        writer.WriteStartObject();
        writer.WriteStartArray(); // <-- Line 89
        foreach (EntityJSON json in data)
        {
            writer.WritePropertyName("type");
            writer.WriteValue(json.type);

            writer.WritePropertyName("name");
            writer.WriteValue(json.name);

            writer.WritePropertyName("position");
            writer.WriteStartArray();
            writer.WritePropertyName("x");
            writer.WriteValue(json.position.x);
            writer.WritePropertyName("z");
            writer.WriteValue(json.position.z);
            writer.WritePropertyName("rot");
            writer.WriteValue(json.position.rot);
            writer.WriteEndArray();

            writer.WritePropertyName("flags");
            writer.WriteValue(json.flags);
        }
        writer.WriteEndArray();
        writer.WriteEndObject();

        return sb.ToString();
    }

更新:感谢@Ayoub_B,这是一个例外:Exception: Newtonsoft.Json.JsonWriterException: Token StartArray in state ObjectStart would result in an invalid JSON object. Path ''. ...

可悲的是,我不知道这意味着什么,我已经在上面的代码中标记了异常(第89行)。

1 个答案:

答案 0 :(得分:1)

您是否有机会在另一个线程下调用此代码?也许是背景工作者? 如果是这样,那么这可能就是为什么不抛出异常的原因。 只需将所有代码包装在Try-Catch块中,您就可以捕获所有异常。

<强>更新

我认为引发异常是因为您在没有属性名称的情况下将数组放在JSON对象中,如果这样做,则通过插入此行

writer.WritePropertyName("arrayKey");
在第89行之前的

,前一个异常将消失,但是你会在循环中得到一个新的异常,这是因为键值对必须在一个对象{}内,所以你可以&#39 ;将它们直接放在数组中。

无论如何,我修复了您发布的代码并从中获得了以下结果:

[
    {
        "type": "type_0",
        "name": "type_0",
        "position": {
            "x": "position.x_0",
            "z": "position.a_0",
            "rot": "position.rot_0"
        },
        "flags": "flags_0"
    }, 
    {
        "type": "type_1",
        "name": "type_1",
        "position": {
            "x": "position.x_1",
            "z": "position.a_1",
            "rot": "position.rot_1"
        },
        "flags": "flags_1"
    }
]

代码:

        writer.WriteStartArray(); // <-- Line 89
        for (int i = 0; i < 2; i++)
        {
            writer.WriteStartObject();
            writer.WritePropertyName("type");
            writer.WriteValue("type_" + i);

            writer.WritePropertyName("name");
            writer.WriteValue("type_" + i);

            writer.WritePropertyName("position");
            writer.WriteStartObject();

            writer.WritePropertyName("x");
            writer.WriteValue("position.x_" + i);
            writer.WritePropertyName("z");
            writer.WriteValue("position.a_" + i);
            writer.WritePropertyName("rot");
            writer.WriteValue("position.rot_" + i);
            writer.WriteEndObject();

            writer.WritePropertyName("flags");
            writer.WriteValue("flags_" + i);
            writer.WriteEndObject();
        }
        writer.WriteEndArray();