2

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

{
  "aaa": [
    {
      "value": "ewfwefew"
    }
  ],
  "bbb": [
    {
      "value": "ewfewfe"
    }
  ]
}

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

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

解开每个数组并在反序列化时提取“值”字段的最佳方法是什么?

4

2 回答 2

3

@Tim Mac 的响应是正确的,但是您可以通过为您的课程编写自定义反序列化器来使其更加优雅MyEntity

它应该是这样的:

private class MyEntityDeserializer implements JsonDeserializer<MyEntity> {

  public MyEntity deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
      throws JsonParseException {

    JsonObject rootObj = json.getAsJsonObject();

    String nid = rootObj 
                   .get("nid")
                   .getAsJsonArray()
                   .get(0)
                   .getAsJsonObject()
                   .get("value")
                   .getAsString();

    String uuid = rootObj 
                   .get("uuid")
                   .getAsJsonArray()
                   .get(0)
                   .getAsJsonObject()
                   .get("value")
                   .getAsString();

    MyEntity entity = new MyEntity(nid, uuid);

    return entity;
  }
}

然后你必须注册TypeAdapter

Gson gson = new GsonBuilder().registerTypeAdapter(MyEntity.class, new MyEntityDeserializer()).create();

最后你只需要像往常一样解析你的 JSON,使用:

MyEntity entity = gson.fromJson(yourJsonString, MyEntity.class);

Gson 将自动使用您的自定义反序列化器将您的 JSON 解析到您的MyEntity类中。

于 2013-07-29T20:47:50.820 回答
2

如果您无法更改您获得的 json,您可能会考虑按原样反序列化它,然后将其转换为更易于管理的东西?

public class TmpEntity {
    public Value[] nid {get;set;}
    public Value[] uuid {get;set;}
}

public class Value {
    public string value {get;set;}
}


public class MyEntity {
    public string nid {get;set;}
    public string uuid {get;set;}
}

var tmp = ...; //deserialize using javascriptserializer
var converted = tmp.Select(a => new MyEntity() 
{
    nid = a.nid.First().value,
    uuid = a.uuid.First().value
}
于 2013-07-29T14:27:29.933 回答