提问人:Raikho 提问时间:8/19/2023 最后编辑:Raikho 更新时间:8/20/2023 访问量:28
JSON 字符串反序列化 API 返回的更改对象
JSON string deserialize changing object returned by API
问:
我正在尝试从 API 反序列化 JSON 字符串,但遇到了一个问题。
事实上,我为从 API 返回的每个对象创建了一个类,但是如果同一个对象(具有相同的 id 和内容)在字符串中多次出现,则 API 会在一个简单的字符串上转换第二个幻影以及更多。
这是我问题的确切例子:
第一次出现这样=>
"object": {
"typeObjet": "obj",
"id": "01",
"link": {
"href": "https:obj.com",
"rel": "sinone"
}
}
第二次像这样出现在同一个 json 字符串中 return =>
"object": "O1",
很明显,如果我尝试反序列化可以在 json 字符串中更改的特定对象,则无法正常工作!xD
所以我当然尝试了一个解决方案,然后来这里问我的问题:
public class ObjJsonConverter<T> : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return true;
}
public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer)
{
if (reader is null)
{
return null;
}
switch (reader.TokenType)
{
case JsonToken.String:
var stringValue = reader.Value?.ToString();
return !string.IsNullOrEmpty(stringValue) ? serializer.Deserialize<T>(new JsonTextReader(new StringReader(stringValue))) : null;
case JsonToken.StartObject:
return serializer.Deserialize<T>(reader);
case JsonToken.StartArray:
return serializer.Deserialize(reader, objectType);
default:
return null;
}
}
public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
}
但这似乎并非一直有效。
错误是:
将值“01”转换为类型“Obj”时出错。路径“[1].obj”,第 1 行,位置 11655。
我能做些什么来解决这个问题?
提前致谢。
编辑:
好的,我找到了解决问题的方法。API 不应以其他形式发送相同的对象。API 不是帮助,而是变成了瘟疫......
我把解决方案放在这里,以防有类似问题的人遇到这种情况:
private Dictionary<KeyClass, ObjectDto> ExistingObjects = new Dictionary<KeyClass, ObjectDto>();
public override bool CanConvert(Type objectType)
{
return objectType == typeof(AClass)
|| objectType == typeof(AnotherClass);
}
public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null)
{
return null;
}
var key = new KeyClass{ ObjectType = objectType };
if (reader.TokenType == JsonToken.String)
{
key.Id = reader.Value.ToString();
if (existingObjects.ContainsKey(key))
{
return existingObjects[key];
}
Log.Logger.Warning($"Object {objectType} with id {key.Id} not found");
return null;
}
var obj = JObject.Load(reader).ToObject(objectType) as ObjectDto;
key.Id = obj.Id;
if (!existingObjects.ContainsKey(key))
{
existingObjects.Add(key, obj);
}
return obj;
}
答: 暂无答案
评论