gpt4 book ai didi

java - JSON 字符串使用多个类进行验证

转载 作者:行者123 更新时间:2023-11-30 05:18:28 31 4
gpt4 key购买 nike

在我的业务流程中,我可能有不同格式的 JSON 字符串。

例如:

String jsonSring = readValue();//this JSON String may contain Teacher object or Student Object

目前,我正在使用这个简单的方法来验证 JSON 是否相对于 TeacherStudent:

try{
Teacher teacher = om.readValue(jsonSring, Teacher.class);
}catch(Exception e){
Student student = om.readValue(jsonSring, Student.class);
}

有没有简化的方法来验证 JSON 内容?

最佳答案

解决方案 1:添加类型字段:

添加指定对象类型的字段可能是最简单的选择,但您必须能够更改对象才能做到这一点。

public Enum UserType { Teacher, Student, /* possibly other types */ }

public interface ISchoolMember
{
public string Name { get; }
..
public UserType Type { get; }
}

一旦获得 JSON,您就可以将其解析为 JObject 并读取 Type 字段:

public ISchoolMember Deserialize(string jsonString)
{
var o = JObject.Parse(jsonString);
return (UserType)o["Type"] switch
{
UserType.Teacher => JsonConvert.Deserialize<Teacher>(jsonString),
UserType.Student => JsonConvert.Deserialize<Student>(jsonString),
_ => throw new ArgumentException("...")
};
}
<小时/>

解决方案 2:检查特殊字段。

如果无法添加新字段,您可以检查解析的 JObject 是否包含仅属于两个对象之一的字段:

public void DeserializeAndDoStuff(string jsonString)
{
var teacherOrStudent = JObject.Parse(jsonString);
if (teacherOrStudent["StudentId"] != null) // it is a student!
{
Student s = teacherOrStudent.ToObject<Student>();
// ... do stuff with the student object
}
else if (teacherOrStudent["TeacherId"] != null) // it is a teacher!
{
Teacher t = teacherOrStudent.ToObject<Teacher>();
// ... do stuff with the teacher object
}
else
{
throw new ArgumentException("The given object is neither a teacher or a student.");
}
}
<小时/>

这两种方法看起来比原始方法更冗长,但有助于摆脱基于异常的编程(这总是不建议的,因为处理异常在资源方面非常昂贵)。

附注
这个实现使用Newtonsoft.Json库,但我猜其他库也有类似的机制。

关于java - JSON 字符串使用多个类进行验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59948274/

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