使用pojo来解析JSON

时间:2017-02-24 03:10:41

标签: java spring-boot jackson

我的json看起来像这样:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    func preferredStatusBarStyle() -> UIStatusBarStyle {
        return UIStatusBarStyle.lightContent
    }

    UINavigationBar.appearance().barTintColor = UIColor(red: 252/255.0, green: 140.0/255.0, blue: 90.0/255.0, alpha: 1)
    UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName:UIColor.white]
    UIToolbar.appearance().barTintColor = UIColor(red: 252/255.0, green: 140.0/255.0, blue: 90.0/255.0, alpha: 1)
    UIBarButtonItem.appearance().tintColor = UIColor.white

    self.window = UIWindow(frame: UIScreen.main.bounds)
    let storyboard = UIStoryboard (name: "Main", bundle: nil)

    ...
}

我试图使用spring restTemplate将其读入pojo。我目前的情人是: -

{
   "bid": "181.57",
   "ask": "181.58",
   "volume": {
       "item1": "543.21",
       "item2": "123.45",
       "timestamp": 1487903100000
   },
   "last": "181.58"
}

问题是" item1"和" item2" int json可以改为" item5"和" item6"取决于我要查询的实体。如果我的变量名为item1和item2,我会得到空值。如何保留变量item1和item2的通用名称,并且仍然能够在通用变量中正确读取值?是否有任何注释可以帮助到这里?

1 个答案:

答案 0 :(得分:2)

我相信您正在寻找Baeldung tutorial

3.3。 @JsonAnySetter

@JsonAnySetter允许您灵活地使用Map作为标准属性。在反序列化时,JSON中的属性将简单地添加到地图中。

让我们看看它是如何工作的 - 我们将使用@JsonAnySetter反序列化实体ExtendableBean:

public class ExtendableBean {
    public String name;
    private Map<String, String> properties;

    @JsonAnySetter
    public void add(String key, String value) {
        properties.put(key, value);
    }
}

这是我们需要反序列化的JSON:

{
    "name":"My bean",
    "attr2":"val2",
    "attr1":"val1"
}

这就是这一切如何联系在一起的:

@Test
public void whenDeserializingUsingJsonAnySetter_thenCorrect()
  throws IOException {
    String json
      = "{\"name\":\"My bean\",\"attr2\":\"val2\",\"attr1\":\"val1\"}";

    ExtendableBean bean = new ObjectMapper()
      .readerFor(ExtendableBean.class)
      .readValue(json);

    assertEquals("My bean", bean.name);
    assertEquals("val2", bean.getProperties().get("attr2"));
}

在您的情况下,您只需在地图中查询您所期望的任何查询所需的字符串值。