gpt4 book ai didi

c# - json.net 错误 : unexpected token deserializing object

转载 作者:太空宇宙 更新时间:2023-11-03 17:13:21 24 4
gpt4 key购买 nike

我有一个包含一些 json 的文件,它是由 json.net 生成的:

[
{
"$type": "Dashboard.Gauges.LabelGaugeSeed, Dashboard",
"Text": "blah",
"LabelColor": {
"X": 1.0,
"Y": 1.0,
"Z": 1.0,
"W": 1.0
},
"Center": {
"X": 0.0,
"Y": 0.0
},
"CharacterWidth": 0.05,
"CharacterHeight": 0.1,
"LineThickness": 0.01,
"TextCentering": 0.5
}
]

反序列化时出现上述错误。任何人都可以找到这个 json 的问题吗?我通过验证器运行它,它说没问题。

它在“Center”之后的空格处出错:如果我更改 Center 和 LabelColor 属性的顺序,它会在“LabelColor”之后以相同的方式出错:

这里是类型的转储:

LabelColor是一个OpenTK Vector4,Center是一个OpenTK Vector2,下面是LabelGaugeSeed:

public class LabelGaugeSeed : IGaugeSeed
{
public IGauge Grow()
{
return new LabelGauge(this);
}

public string Text;
[JsonConverter(typeof(Vector4Converter))]
public Vector4 LabelColor;
[JsonConverter(typeof(Vector2Converter))]
public Vector2 Center;
public float CharacterWidth;
public float CharacterHeight;
public float LineThickness;
public float TextCentering;
}

这里是 Vector4Converter:

public class Vector4Converter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(Vector2);
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
reader.Read();
reader.Read();
var x = serializer.Deserialize<float>(reader);

reader.Read();
reader.Read();
var y = serializer.Deserialize<float>(reader);

reader.Read();
reader.Read();
var z = serializer.Deserialize<float>(reader);

reader.Read();
reader.Read();
var w = serializer.Deserialize<float>(reader);

return new Vector4(x, y, z, w);
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
Vector4 vectorValue = (Vector4)value;

writer.WriteStartObject();

writer.WritePropertyName("X");
writer.WriteValue(vectorValue.X);

writer.WritePropertyName("Y");
writer.WriteValue(vectorValue.Y);

writer.WritePropertyName("Z");
writer.WriteValue(vectorValue.X);

writer.WritePropertyName("W");
writer.WriteValue(vectorValue.Y);

writer.WriteEndObject();
}
}

Vector2Converter 完全相同,只是它不包含 Z 和 W 属性的代码,而且名称不同。

反序列化过程将成功通过第一个,但甚至无法进入第二个。

Vector 类可以在这里找到:https://github.com/opentk/opentk/tree/develop/Source/OpenTK/Math

最佳答案

Tl;dr - 问题出在您的 Vector[X]Converters 中。您阅读了所有属性,但实际上并没有导航到对象的末尾。在返回具体对象的最后一行之前,您需要一个额外的 reader.Read()

更深入的解释:

当您编写自定义转换器时,JSON.NET 对 JsonReader 的状态很挑剔。你需要一直遍历到reader的末尾,不管你是否真的需要剩下的数据(换句话说,你不能提前返回)。

在此示例中,您读取了所需的值 (W),然后立即返回一个新的具体对象,因为您拥有所需的所有数据。但是,JsonReader 仍在检查属性节点,因此 JSON.NET 认为仍有数据等待反序列化。这就是为什么你得到

Additional text found in json string after finishing deserializing object

如果您在 JsonConverter 中放置一个断点并在您通过标记前进时观察 reader 对象的状态,您可以自己看到这一点。最后一个,状态是:

...
Path: "LabelColor.W"
TokenType: Float
Value: 1.0
....

如果您让 JsonReader 处于该状态,您将收到错误。但是,如果您执行最后一次 reader.Read(),则状态为:

...
Path: "LabelColor"
TokenType: EndObject
Value: null
...

现在 JSON.NET 很高兴!

关于c# - json.net 错误 : unexpected token deserializing object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28014002/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com