如何打开单个项目数组并将值字段提取到一个简单的字段中?

时间:2013-07-25 09:03:27

标签: jackson gson

我有一个类似于以下内容的JSON文档:

{
  "aaa": [
    {
      "value": "wewfewfew"
    }
  ],
  "bbb": [
    {
      "value": "wefwefw"
    }
  ]
}

我需要将其反序列化为更干净的内容,例如:

public class MyEntity{
  private String aaa;
  private String bbb;
}

解包每个数组并在反序列化时提取“值”字段的最佳方法是什么?只定制定制者?或者有更好的方式吗?

2 个答案:

答案 0 :(得分:1)

使用Gson的快速解决方案是使用JsonDeserializer,如下所示:

package stackoverflow.questions.q17853533;

import java.lang.reflect.Type;

import com.google.gson.*;

public class MyEntityDeserializer implements JsonDeserializer<MyEntity> {
    public MyEntity deserialize(JsonElement json, Type typeOfT,
        JsonDeserializationContext context) throws JsonParseException {

    String aaa = json.getAsJsonObject().getAsJsonArray("aaa").get(0)
        .getAsJsonObject().get("value").getAsString();
    String bbb = json.getAsJsonObject().getAsJsonArray("bbb").get(0)
        .getAsJsonObject().get("value").getAsString();

    return new MyEntity(aaa, bbb);
    }
}

然后在解析时使用它:

package stackoverflow.questions.q17853533;

import com.google.gson.*;

public class Q17853533 {


  public static void main(String[] arg) {
    GsonBuilder builder = new GsonBuilder();
    builder.registerTypeAdapter(MyEntity.class, new MyEntityDeserializer());

    String testString = "{        \"aaa\": [{\"value\": \"wewfewfew\"  } ],  \"bbb\": [  {\"value\": \"wefwefw\" } ]    }";


    Gson gson = builder.create();
    MyEntity entity= gson.fromJson(testString, MyEntity.class);
    System.out.println(entity);
  }

}

答案 1 :(得分:1)

为完整起见,如果您使用jackson,则可以启用反序列化功能UNWRAP_SINGLE_VALUE_ARRAYS。 要做到这一点,你必须为ObjectMapper启用它,如:

ObjectMapper objMapper = new ObjectMapper()
    .enable(DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS);

有了这个,你就可以像杰克逊一样习惯这个班级。 例如,假设班级Person

public class Person {
    private String name;
    // assume getter, setter et al.
}

和json personJson

{
    "name" : [
        "John Doe"
    ]
}

我们可以通过以下方式对其进行反序列化:

ObjectMapper objMapper = new ObjectMapper()
    .enable(DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS);

Person p = objMapper.readValue(personJson, Person.class);