org.codehaus.jackson.JsonParseException:意外字符(”(代码65279 / 0xfeff)):预期有效值

我正面临一个奇怪的问题,我对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 oResult = mapper.readValue(strResponse, new TypeReference<RawResult>() {}); 

其中RawResult是一个带有Template和RawCatalogs的类,它是一个带有嵌套对象的类,它用于正确地反序列化响应,但现在它显示标题中的错误。

类的定义是这样的(不知道是否需要嵌套类的信息才能获得完全支持?我认为我已经很好地映射了它们,只是为了清晰起见而发布了重要内容)

 import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonProperty; final public class RawResult { private final Integer _StatusCode; private final Boolean _Status; private final String _Message; private final T _Result; public RawResult(Class 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 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 _Agencies; private final List _Areas; private final List _Districts; private final List _FacilityOccupacies; private final List _FireSprinklers; private final List _FoundSources; private final List _Locations; private final List _MarshallSwifts; private final List _Profiles; private final List _ProjectCategories; private final List _Projects; private final List _Structures; @JsonCreator public RawCatalogs( @JsonProperty("Agencies") List Agencies, @JsonProperty("Areas") List Areas, @JsonProperty("Districts") List Districts, @JsonProperty("FacilityOccupacies") List FacilityOccupacies, @JsonProperty("FireSprinkler") List FireSprinklers, @JsonProperty("FoundSources") List FoundSources, @JsonProperty("Locations") List Locations, @JsonProperty("MarshallSwift") List MarshallSwifts, @JsonProperty("Profiles") List Profiles, @JsonProperty("ProjectCategories") List ProjectCategories, @JsonProperty("Projects") List Projects, @JsonProperty("Structures") List 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 get_Agencies() { return _Agencies; } /** * @return the _Areas */ @JsonProperty("Areas") public List get_Areas() { return _Areas; } @JsonProperty("Districts") /** * @return the _Districts */ public List get_Districts() { return _Districts; } /** * @return the _FacilityOccupacies */ @JsonProperty("FacilityOccupacies") public List get_FacilityOccupacies() { return _FacilityOccupacies; } /** * @return the _FireSprinklers */ @JsonProperty("FireSprinkler") public List get_FireSprinklers() { return _FireSprinklers; } /** * @return the _FoundSources */ @JsonProperty("FoundSources") public List get_FoundSources() { return _FoundSources; } /** * @return the _Locations */ @JsonProperty("Locations") public List get_Locations() { return _Locations; } /** * @return the _MarshallSwifts */ @JsonProperty("MarshallSwift") public List get_MarshallSwifts() { return _MarshallSwifts; } /** * @return the _Profiles */ @JsonProperty("ProjectCategories") public List get_Profiles() { return _Profiles; } /** * @return the _ProjectCategories */ @JsonProperty("Profiles") public List get_ProjectCategories() { return _ProjectCategories; } /** * @return the _Projects */ @JsonProperty("Projects") public List get_Projects() { return _Projects; } /** * @return the _Structures */ @JsonProperty("Structures") public List get_Structures() { return _Structures; } } 

所以我的问题是为什么它显示错误? 我在stackoverflow上搜索了类似的问题,所有似乎都是一个编码错误,但不是相同的代码错误,我也无法控制WCF。

实际上,如果我复制粘贴Json Respone在这个页面,它似乎很好。

我也尝试使用mapper.configure,但Jsonparser没有任何function

我究竟做错了什么?

我在读取JSON文件时遇到了同样的错误。

您可以确保从没有此初始0xfeff的RESTful WCF获得响应,或者在将其发送到JSON解析器之前将其删除。 也许trim()可以做到这一点……