【问题标题】:nested json convert unnested domain with java嵌套的json用java转换未嵌套的域
【发布时间】:2015-08-14 13:47:00
【问题描述】:

有没有办法将嵌套的 json 转换为未嵌套的对象 我从网络服务中获得了嵌套的 json

{
  name:"name"
  address:{addressName:"address",
           addressList:[{State:"state1",
                         City:"city1"},
                        {State:"state2",
                         City:"city2"}]
          }
}

我的域名是这样的

public class Person{
  private String name;
  private String addressName;
  private String addressState1;
  private String addressCity1;
  private String addressState2;
  private String addressCity2;
}

由于web服务只提供两个地址,所以我们不需要创建另一个域作为PersonAddress,有没有我可以使用inverse of @JsonUnwrapped的功能,所以我将 json 转换为我的域。

【问题讨论】:

  • 你为什么要同时标记 gson 和 jackson?您使用的是哪个库?
  • @durron597,他们中的任何一个都可以解决这个问题,我可以

标签: java json jackson gson


【解决方案1】:

我猜你可以使用@JsonCreator 和@JsonProperty 来构造一个新的Person 实例,但恐怕你仍然需要为PersonAddress 和AddressDetails 单独的域类:

人员地址:

public class PersonAddress {
 private String addressName;
 private List<AddressDetails> addressList;
}

详细地址:

public class AddressDetails {
 private String state;
 private String city;
}

人物:

public class Person {
  private String name;
  private String addressName;
  private String addressState1;
  private String addressCity1;
  private String addressState2;
  private String addressCity2;

  @JsonCreator
  public Person(@JsonProperty("name") String name, @JsonProperty("address") PersonAddress address) {
    this.addressName = address.addressName;
    this.addressState1 = address.addressList.get(0).getState();
    this.addressCity1 = address.addressList.get(0).getCity();
    this.addressState2 = address.addressList.get(1).getState();
    this.addressCity2 = address.addressList.get(1).getCity();
  }
}

查看这些代码示例:http://www.programcreek.com/java-api-examples/index.php?api=org.codehaus.jackson.annotate.JsonCreator

【讨论】:

  • 感谢您的回复,但问题是我不想构建其他域,例如 PersonAddress 和 AddressDetails
【解决方案2】:

这和How do I deserialize Json with modifying the structure?几乎是同一个问题,只是你的json结构不同。请阅读那里的说明以获取更多详细信息。如果您的示例比您在问题中提供的示例更复杂,请阅读完整答案以了解如何进一步修改它。

你可以使用这个TypeAdapter&lt;Person&gt;来做你想要的解析:

import java.io.IOException;

import com.google.gson.*;
import com.google.gson.stream.*;

public class PersonTypeAdapter extends TypeAdapter<Person> {
  @Override
  public void write(JsonWriter out, Person value) throws IOException {
    if (value == null) {
      out.nullValue();
      return;
    }

    out.nullValue();
    // exercise for you, if you even need it
  }

  @Override
  public Person read(JsonReader reader) throws IOException {
    if (reader.peek() == JsonToken.NULL) {
      reader.nextNull();
      return null;
    }

    reader.beginObject();
    validateName(reader, "name");
    String name = reader.nextString();
    validateName(reader, "address");
    reader.beginObject();
    validateName(reader, "addressName");
    String addressName = reader.nextString();
    validateName(reader, "addressList");
    reader.beginArray();
    reader.beginObject();
    validateName(reader, "State");
    String addressState1 = reader.nextString();
    validateName(reader, "City");
    String addressCity1 = reader.nextString();
    reader.endObject();
    reader.beginObject();
    validateName(reader, "State");
    String addressState2 = reader.nextString();
    validateName(reader, "City");
    String addressCity2 = reader.nextString();    
    reader.endObject();
    reader.endArray();
    reader.endObject();
    reader.endObject();
    return new Person(name, addressName, 
        addressState1, addressCity1,
        addressState2, addressCity2);
  }

  private void validateName(JsonReader reader, String string) throws IOException {
    String name = reader.nextName();
    if(!string.equals(name)) {
      throw new JsonSyntaxException("Expected: \"" + string + "\", got \"" + name + "\"");
    }
  }
}

然后,只需向您的GsonBuilder 注册即可:

GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(Person.class, new PersonTypeAdapter());
Gson g = builder.create();
Person person = g.fromJson(jsonString, Person.class);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-09
    • 2021-09-26
    • 2017-07-27
    • 2022-08-19
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多