I'm facing an Strange problem, I'm very new to Android and Json. I'm consuming a RESTful WCF that shows a json response like this one:
{"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":[]}}
I'm trying to deserialize it to a complex object with Jackson 1.9.11.
So I use
final ObjectMapper mapper = new ObjectMapper();
RawResult<RawCatalogs> oResult = mapper.readValue(strResponse, new TypeReference<RawResult<RawCatalogs>>() {});
Where RawResult is a class with a Template and RawCatalogs its a class with nested Objects, it used to deserialize the response correctly, but now it's showing the error in the title.
The definition of the classes is this (don't know if information of the nested classes is needed for full support? I think I have mapped them very well, just going to post the importants for clarity )
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;
}
}
So my question is why It is showing that error? I searched similar questions on stackoverflow, all seemed about an Encoding Error but is not the same code error and also I have not control over the WCF.
Actually If I copy paste the Json Respone in this page it seems well formed.
I also tried to use the mapper.configure but none of the features of Jsonparser worked
What am I doing wrong?
I got the same error reading a JSON file.
Either you ensure that you get a response from your RESTful WCF without this initial 0xfeff or you strip it before sending it to the JSON parser. Maybe trim() could do the trick...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With