我是杰克逊的新手,我在确定处理动态JSON文件的最佳方法时遇到了一些问题。我知道我可以通过流式传输或树API解决问题,但这会涉及很多代码,这些代码不易维护。例如,请使用以下两个json文件:
{
something: "somethingValue"
somethingelse: "anotherValue"
url: "http://something.com"
}
和
{
something: "somethingValue"
somethingelse: "anotherValue"
url: {
service1: [
"http://something.com",
"https://something.com" ],
service2: [
"http://something2.com",
"https://something2.com" ],
}
}
解析后第一个json对象的默认行为,应该将URL添加到子类“URL”中的service1和service2 url列表中。其中第二个允许为每个URL指定非常具体的URL。我正在计划使用的url类的数据对象如下:
public class url {
// ideally, I would use the java.net.URL instead of String
public List<String> service1;
public List<String> service2;
// also includes getter/setters using a fluent style
...
}
还有一些其他的父类会有一个URL参数和其他第一级json参数。
在杰克逊处理这个问题的最佳方法是什么?
答案 0 :(得分:1)
第二个是无效的JSON,这是:
{
"something": "somethingValue",
"somethingelse": "anotherValue",
"url": {
"service1" : [
"http://something.com",
"https://something.com" ],
"service2" : [
"http://something2.com",
"https://something2.com" ]
}
}
您可以创建它/使用类似A的消费它,如下所示
class A{
String something;
String somethingElse;
B url;
}
class B{
Str service1;
List<String> service2;
}
为了实现任何动态,无论如何,你必须把它放在列表中,因此不是上面的解决方案,你可以这样做
class A{
String something;
String somethingElse;
B url;
}
class B{
List<C> services;
}
class C{
List<String> service;
}
答案 1 :(得分:1)
我最终混合JsonNode来实现这一目标。
public class Foo { @JsonProperty("something") private String something; @JsonProperty("somethingelse") private String somethingelse; @JsonProperty("url") JsonNode url; // getters setters public static Foo parse(String jsonString) { ObjectMapper mapper = new ObjectMapper(); Foo foo = mapper.readValue(jsonString, Foo.class); return foo; } public static boolean validate(Foo foo) { JsonNode url = foo.path("url"); if (url.isTextual()) { // this is the first case {"url": "http://something.com"} System.out.println(url.getTextValue()); } else { // This is the second case } } }
答案 2 :(得分:-1)
答案:
在与杰克逊挣扎以简单而优雅的方式做我想做的事后,我最终切换到Gson库进行JSON解析。它允许我为我的课程创建一个非常简单的自定义反序列化器。
我可以在这里找到类似的例子:
http://www.baeldung.com/gson-deserialization-guide
我很欣赏杰克逊的帮助和指导,但这让我意识到杰克逊不会满足我的需求。
-Stewart