JSON 字符串反序列化 API 返回的更改对象

JSON string deserialize changing object returned by API

提问人:Raikho 提问时间:8/19/2023 最后编辑:Raikho 更新时间:8/20/2023 访问量:28

问:

我正在尝试从 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;
    }
JSON 字符串 对象 类型转换 转换器

评论


答: 暂无答案