我面临一个奇怪的问题,我对 Android 和 Json 很陌生。我正在使用一个 RESTful WCF,它显示一个像这样的 json 响应:
{"StatusCode":200,"Message":"","Result":{"Agencies":[],"Areas":[{"id":11,"area_name":"area 10","description":"updated 10","active":true},{"id":12,"area_name":"Area 11","description":"temp 11","active":true},{"id":13,"area_name":"Area 12","description":"temp12","active":true},{"id":14,"area_name":"area 13","description":"temp 13 3","active":true},{"id":7,"area_name":"Area 6","description":"temp6","active":true},{"id":8,"area_name":"area 7","description":"temp7","active":true},{"id":9,"area_name":"area 8","description":"temp 8","active":true},{"id":10,"area_name":"area 9","description":"temp 9","active":true},{"id":1,"area_name":"area1","description":"temp","active":true},{"id":3,"area_name":"area2","description":"temp2","active":true},{"id":4,"area_name":"area3","description":"asdddasdsa","active":true},{"id":5,"area_name":"area4","description":"dasdassad","active":true},{"id":6,"area_name":"area5","description":"temp5","active":true}],"Districts":[{"id":5,"district_name":"District 5","district_code":"1","description":"temp 5","area_id":8,"area_name":"area 7","active":true},{"id":4,"district_name":"district 4","district_code":"2","description":"temp 4","area_id":8,"area_name":"area 7","active":true},{"id":1,"district_name":"district 1","district_code":"1","description":"descrp","area_id":10,"area_name":"area 9","active":true},{"id":2,"district_name":"district 2","district_code":"1","description":"descrp","area_id":10,"area_name":"area 9","active":true},{"id":3,"district_name":"district 3","district_code":"1","description":"temp 3","area_id":5,"area_name":"area4","active":true}],"FacilityOccupacies":[{"id":1,"facility_name":"C","description":"Computer facility","active":true},{"id":2,"facility_name":"CA","description":"Adult correctional facility","active":true},{"id":3,"facility_name":"CJ","description":"Juvenile correctional facility","active":true},{"id":4,"facility_name":"GS","description":"Garage for operations support, including vehicle maintenance, repair or fuel depot","active":true},{"id":5,"facility_name":"GP","description":"Garage for parking","active":true},{"id":6,"facility_name":"I","description":"Light industrial facility","active":true},{"id":7,"facility_name":"L","description":"Library","active":true},{"id":8,"facility_name":"M","description":"Medical facilities such as clinics, infirmaries or hospitals","active":true},{"id":9,"facility_name":"N","description":"Non-categorized facility","active":true},{"id":10,"facility_name":"OM","description":"Office buildings where approximately 75% or more of occupants are senior level managers","active":true},{"id":11,"facility_name":"OS","description":"Office building","active":true},{"id":12,"facility_name":"SP","description":"Primary school","active":true},{"id":13,"facility_name":"SS","description":"Secondary school","active":true},{"id":14,"facility_name":"U","description":"University","active":true},{"id":15,"facility_name":"W","description":"Warehouse","active":true}],"FireSprinkler":[{"id":2,"fire_sprinkler":"N","description":"A lack of a fire sprinkler fire suppression system.","active":true},{"id":3,"fire_sprinkler":"P","description":"A partial fire sprinkler fire suppression system.","active":true},{"id":1,"fire_sprinkler":"Y","description":"A full fire sprinkler fire suppression system.","active":true}],"FoundSources":[{"id":1,"found_source_name":"COP","description":"Certificates of Participation","active":true},{"id":2,"found_source_name":"COSF","description":"Capital Outlay Stabilization Fund","active":true},{"id":6,"found_source_name":"Exempt","description":"Exempt From Rent","active":true},{"id":4,"found_source_name":"GF","description":"Capital Outlay Stabilization Fund","active":true},{"id":5,"found_source_name":"N/A","description":"Not Applicable","active":true},{"id":3,"found_source_name":"PLTO","description":"Private Lease-To-Own","active":true}],"Locations":[{"id":1,"location_name":"location 1","location_code":"1","description":"temp 1","district_id":3,"district_name":"district 3","active":true}],"MarshallSwift":[{"id":1,"class":"A","frame":"Structural steel columns and beams fire proofed with masonry, concrete, plaster, or other incombustible material.","floor":"Concrete or concrete covered steel deck, fire-proofed.","roof":"Concrete or concrete covered steel deck,fire-proofed.","walls":"Non-bearing curtain walls, masonry, concrete, metal, and glass panels, stone.","active":true},{"id":2,"class":"B","frame":"Reinforced concrete columns and beams.","floor":"Concrete or concrete covered steel deck, fire-proofed.","roof":"Concrete or concrete covered steel deck, fire-proofed.","walls":"Non-bearing curtain walls, masonry, concrete, metal, and glass panels, stone.","active":true},{"id":3,"class":"C","frame":"Structural steel columns and beams fire-proofed with masonry, concrete, plaster, or other incombustible material.","floor":"Concrete or concrete covered steel deck, fire-proofed.","roof":"Wood or steel joist, wood or steel deck.","walls":"Brick, concrete block, or tile masonry, tilt-up formed concrete.","active":true},{"id":4,"class":"D","frame":"Wood or steel studs in bearing wall, wood or steel skeleton frame.","floor":"Wood or steel floor joists or slabs on ground.","roof":"Wood or steel joist, wood or steel deck.","walls":"Almost any material except masonry or concrete. May have masonry veneer over steel or wood framing.","active":true},{"id":5,"class":"S","frame":"Steel – No fire protection.","floor":"Concrete","roof":"Steel – No fire protection.","walls":"Steel – No fire protection.","active":true}],"Profiles":[{"id":1,"profile_name":"Administrator","description":"System Administrator","active":true},{"id":2,"profile_name":"Inspector","description":"Building Inspector","active":true}],"ProjectCategories":[{"id":1,"category_name":"Fire/Life Safety","description":"Fire/Life Safety","active":true},{"id":2,"category_name":"HVAC","description":"HVAC","active":true},{"id":3,"category_name":"Infrastructure","description":"Infrastructure","active":true},{"id":4,"category_name":"Interior Renovation","description":"Interior Renovation","active":true},{"id":5,"category_name":"Shell","description":"Shell","active":true},{"id":6,"category_name":"Energy Consv","description":"Energy Consv","active":true},{"id":7,"category_name":"ADA Access","description":"ADA Access","active":true},{"id":8,"category_name":"Building Services","description":"Building Services","active":true},{"id":9,"category_name":"NONE","description":"NONE","active":true}],"Projects":[],"Structures":[]}}
我正在尝试使用 Jackson 1.9.11 将其反序列化为复杂对象。
所以我用
final ObjectMapper mapper = new ObjectMapper();
RawResult<RawCatalogs> oResult = mapper.readValue(strResponse, new TypeReference<RawResult<RawCatalogs>>() {});
RawResult 是一个带有模板的类,而 RawCatalogs 是一个带有嵌套对象的类,它曾经正确地反序列化响应,但现在它在标题中显示错误。
类的定义是这样的(不知道嵌套类的信息是否需要完全支持?我想我已经很好地映射了它们,只是为了清楚起见将重要的发布)
import org.codehaus.jackson.annotate.JsonCreator;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.annotate.JsonProperty;
final public class RawResult<T> {
private final Integer _StatusCode;
private final Boolean _Status;
private final String _Message;
private final T _Result;
public RawResult(Class<T> oClass) throws InstantiationException, IllegalAccessException
{
_StatusCode = null;
_Message = null;
_Result = BuildGeneric(oClass);
_Status = false;
}
@JsonCreator
public RawResult(
@JsonProperty("StatusCode") Integer StatusCode,
@JsonProperty("Message") String Message,
@JsonProperty("Result") T Result)
{
_StatusCode = StatusCode;
_Message = Message;
_Result = Result;
_Status = StatusCode == 200;
}
private T BuildGeneric(Class<T> oClass) throws InstantiationException,
IllegalAccessException
{
return oClass.newInstance();
}
/**
* @return the _StatusCode
*/
@JsonProperty("StatusCode")
public Integer get_StatusCode() {
return _StatusCode;
}
/**
* @return the _Message
*/
@JsonProperty("Message")
public String get_Message() {
return _Message;
}
/**
* @return the _Result
*/
@JsonProperty("Result")
public T get_Result() {
return _Result;
}
/**
* @return the _Status
*/
@JsonIgnore
public Boolean get_Status() {
return _Status;
}
}
public interface ICatalog {
String _Id = null;
String _Description = null;
boolean _Active = false;
/**
* @return the _Id
*/
public String get_Id();
/**
* @return the _Description
*/
public String get_Description() ;
/**
* @return the _Active
*/
public boolean is_Active() ;
}
public abstract class RawCatalog implements ICatalog {
protected final String _Id;
protected final String _Description;
protected final String _Name;
protected final boolean _Active;
public RawCatalog(String Id, String Description,String Name, boolean Active)
{
_Id = Id;
_Description = Description;
_Name = Name;
_Active = Active;
}
@JsonProperty("id")
public String get_Id() {
// TODO Auto-generated method stub
return _Id;
}
@JsonProperty("description")
public String get_Description() {
// TODO Auto-generated method stub
return _Description;
}
@JsonProperty("name")
public String get_Name() {
// TODO Auto-generated method stub
return _Name;
}
@JsonProperty("active")
public boolean is_Active() {
// TODO Auto-generated method stub
return _Active;
}
}
public final class RawAgency extends RawCatalog {
private final String _AgencyCode;
private final String _LocationId;
private final String _LocationName;
private final int _NumberOfStructures;
@JsonCreator
public RawAgency(
@JsonProperty("id") String Id,
@JsonProperty("description") String Description,
@JsonProperty("agency_name") String Name,
@JsonProperty("active") Boolean Active,
@JsonProperty("agency_code") String AgencyCode,
@JsonProperty("get_LocationId") String LocationId,
@JsonProperty("get_LocationName") String LocationName,
@JsonProperty("get_NumberOfStructures") int NumberOfStructures
)
{
super(Id, Description, Name,Active);
_AgencyCode = AgencyCode;
_LocationId = LocationId;
_LocationName = LocationName;
_NumberOfStructures = NumberOfStructures;
}
/**
* @return the _AgencyName
*/
@JsonProperty("agency_name")
@Override
public String get_Name() {
return super.get_Name();
}
/**
* @return the _AgencyCode
*/
@JsonProperty("agency_code")
public String get_AgencyCode() {
return _AgencyCode;
}
/**
* @return the _LocationId
*/
@JsonProperty("location_id")
public String get_LocationId() {
return _LocationId;
}
/**
* @return the _NumberOfStructures
*/
@JsonProperty("number_of_structures")
public int get_NumberOfStructures() {
return _NumberOfStructures;
}
/**
* @return the _LocationName
*/
@JsonProperty("location_name")
public String get_LocationName() {
return _LocationName;
}
}
import java.util.List;
import org.codehaus.jackson.annotate.JsonCreator;
import org.codehaus.jackson.annotate.JsonProperty;
final public class RawCatalogs {
private final List<RawAgency> _Agencies;
private final List<RawArea> _Areas;
private final List<RawDistrict> _Districts;
private final List<RawFacilityOccupacy> _FacilityOccupacies;
private final List<RawFireSprinkler> _FireSprinklers;
private final List<RawFoundSources> _FoundSources;
private final List<RawLocation> _Locations;
private final List<RawMarshallSwift> _MarshallSwifts;
private final List<RawProfile> _Profiles;
private final List<RawProjectCategory> _ProjectCategories;
private final List<RawProject> _Projects;
private final List<RawStructure> _Structures;
@JsonCreator
public RawCatalogs(
@JsonProperty("Agencies") List<RawAgency> Agencies,
@JsonProperty("Areas") List<RawArea> Areas,
@JsonProperty("Districts") List<RawDistrict> Districts,
@JsonProperty("FacilityOccupacies") List<RawFacilityOccupacy> FacilityOccupacies,
@JsonProperty("FireSprinkler") List<RawFireSprinkler> FireSprinklers,
@JsonProperty("FoundSources") List<RawFoundSources> FoundSources,
@JsonProperty("Locations") List<RawLocation> Locations,
@JsonProperty("MarshallSwift") List<RawMarshallSwift> MarshallSwifts,
@JsonProperty("Profiles") List<RawProfile> Profiles,
@JsonProperty("ProjectCategories") List<RawProjectCategory> ProjectCategories,
@JsonProperty("Projects") List<RawProject> Projects,
@JsonProperty("Structures") List<RawStructure> Structures
)
{
_Agencies = Agencies;
_Areas = Areas;
_Districts = Districts;
_FacilityOccupacies = FacilityOccupacies;
_FireSprinklers = FireSprinklers;
_FoundSources = FoundSources;
_Locations = Locations;
_MarshallSwifts = MarshallSwifts;
_Profiles = Profiles;
_ProjectCategories = ProjectCategories;
_Projects = Projects;
_Structures = Structures;
}
/**
* @return the _Agencies
*/
@JsonProperty("Agencies")
public List<RawAgency> get_Agencies() {
return _Agencies;
}
/**
* @return the _Areas
*/
@JsonProperty("Areas")
public List<RawArea> get_Areas() {
return _Areas;
}
@JsonProperty("Districts")
/**
* @return the _Districts
*/
public List<RawDistrict> get_Districts() {
return _Districts;
}
/**
* @return the _FacilityOccupacies
*/
@JsonProperty("FacilityOccupacies")
public List<RawFacilityOccupacy> get_FacilityOccupacies() {
return _FacilityOccupacies;
}
/**
* @return the _FireSprinklers
*/
@JsonProperty("FireSprinkler")
public List<RawFireSprinkler> get_FireSprinklers() {
return _FireSprinklers;
}
/**
* @return the _FoundSources
*/
@JsonProperty("FoundSources")
public List<RawFoundSources> get_FoundSources() {
return _FoundSources;
}
/**
* @return the _Locations
*/
@JsonProperty("Locations")
public List<RawLocation> get_Locations() {
return _Locations;
}
/**
* @return the _MarshallSwifts
*/
@JsonProperty("MarshallSwift")
public List<RawMarshallSwift> get_MarshallSwifts() {
return _MarshallSwifts;
}
/**
* @return the _Profiles
*/
@JsonProperty("ProjectCategories")
public List<RawProfile> get_Profiles() {
return _Profiles;
}
/**
* @return the _ProjectCategories
*/
@JsonProperty("Profiles")
public List<RawProjectCategory> get_ProjectCategories() {
return _ProjectCategories;
}
/**
* @return the _Projects
*/
@JsonProperty("Projects")
public List<RawProject> get_Projects() {
return _Projects;
}
/**
* @return the _Structures
*/
@JsonProperty("Structures")
public List<RawStructure> get_Structures() {
return _Structures;
}
}
所以我的问题是为什么它显示该错误?我在 stackoverflow 上搜索了类似的问题,似乎都是关于编码错误但不是相同的代码错误,而且我无法控制 WCF。
实际上,如果我在此页面中复制粘贴 Json 响应,它似乎格式正确。
我也尝试使用 mapper.configure 但 Jsonparser 的所有功能都不起作用
我究竟做错了什么?