gpt4 book ai didi

c# - 在 Json.Net 的 JsonConverter<> ReadJson() 中,为什么 reader..Value 为空?

转载 作者:行者123 更新时间:2023-12-04 03:31:11 28 4
gpt4 key购买 nike

我正在尝试为 NetTopologySuite 几何编写自定义 JsonConverter。
我的模型:

public class MyModel
{
public string myName { get; set; }

[JsonConverter(typeof(MyPolygonConverter))]
public Polygon myPolygon { get; set; }
}
我的转换器:
public class MyPolygonConverter : JsonConverter<Polygon>
{
public override Polygon ReadJson(JsonReader reader, Type objectType, Polygon existingValue,
bool hasExistingValue, JsonSerializer serializer)
{
var geoJson = (string)reader.Value;

// ... not relevant, because reader.Value is null.
}
}
我在做什么:
var deSerialized = JsonConvert.DeserializeObject<MyModel>("{\"myName\":\"My Name\",\"myPolygon\":{\"type\":\"Polygon\",\"coordinates\":[[[-100.0,45.0],[-98.0,45.0],[-99.0,46.0],[-100.0,45.0]]]}}");
发生了什么:
正在调用我的转换器,但 reader.Value 为空。
我在网上看到的例子使用 (string)reader.Value 来访问需要转换的json字符串。但就我而言, reader.Value 为空。
我应该如何访问我需要转换的 JSON 字符串?
要清楚 - 我有一个模型类,它包含一个类的属性 - 多边形 - 我在序列化时转换为 GeoJson,我需要从 GeoJson 转换回该类。
所以,我的起始 json 是:
{
"myName" : "My Name",
"myPolygon" : {
"type" : "Polygon",
"coordinates" : [
[
[-100.0, 45.0],
[-98.0, 45.0],
[-99.0, 46.0],
[-100.0, 45.0]
]
]
}
}
我需要把“myPolygon”的 child 的所有东西都交给我的转换代码。在我见过的简单示例中,reader.Value 将值作为字符串提供。在这种情况下它不会,很可能是因为“myPolygon”的 child 不是单个值,而是一个复杂的 json 对象。
当作为单个 json 字符串提供时,我已经有用于解析值的代码。那么我怎样才能得到 child ,作为一个单一的json字符串呢?

最佳答案

我认为您对 JsonConverters 的工作方式有误解。读者不会给你原始的 JSON。相反,它允许您逐个遍历 JSON 中的 token 。reader.Value为空,因为您的转换器正在处理一个对象,而不是一个字符串,并且在调用您的转换器时,阅读器位于 StartObject token 。您需要调用reader.Read()循环遍历对象以获取属性名称和值,直到到达 EndObject token 。
这是一个演示该过程的 fiddle ,尽管它实际上并没有填充多边形。 https://dotnetfiddle.net/MQE6N5
如果你真的想要转换器中的 JSON 字符串,你可以从阅读器加载一个 JObject,然后调用它的 ToString() 方法:

public override Polygon ReadJson(JsonReader reader, Type objectType, Polygon existingValue, bool hasExistingValue, JsonSerializer serializer)
{
JObject jo = JObject.Load(reader);
string json = jo.ToString(Formatting.None);

Polygon poly = ConvertJsonToPolygon(json); // your conversion method

return poly;
}
IMO 更好的解决方案是使用 JObject 的工具来实际进行转换。您可以轻松地从 JObject 中挑选值并从中填充您的 Polygon 类:
public override Polygon ReadJson(JsonReader reader, Type objectType, Polygon existingValue, bool hasExistingValue, JsonSerializer serializer)
{
JObject jo = JObject.Load(reader);
Polygon poly = new Polygon();
poly.type = (string)jo["type"];
poly.coordinates = jo["coordinates"].ToObject<double[][][]>(serializer);
return poly;
}
fiddle : https://dotnetfiddle.net/OFSP1h

关于c# - 在 Json.Net 的 JsonConverter<> ReadJson() 中,为什么 reader..Value 为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66783180/

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