In order to deal with custom Serializers / Deserializers rendered into a separate project, it produces the following error:

ERROR / AndroidRuntime (288): java.lang.RuntimeException: Unable to start activity ComponentInfo {com.example / com.example.MyActivity}: java.lang.UnsupportedOperationException: Can not create a generator

alt text

Program files:

MyActivity.java

package com.example; import android.app.Activity; import android.os.Bundle; import com.example.JacksonObject; import org.codehaus.jackson.map.*; import org.codehaus.jackson.JsonGenerationException; import java.io.IOException; public class MyActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); String jacksonString = "{\"DateField\":\"/Date(61283424600000)/\",\"StringField\":\"STRING_string\",\"DoubleField\":\"87.12345\",\"IntegerField\":\"387\"}"; try { MyJsonWrapper sss = new MyJsonWrapper(); JacksonObject[] mailItems2 = sss.getMyJson().readValue(jacksonString, JacksonObject[].class); int a2 = 3; //это просто так, что бы поставить точки!!! int b = a2; //это просто так, что бы поставить точки!!! } catch (JsonGenerationException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } int a = 3; //это просто так, что бы поставить точки!!! int s = 10; //это просто так, что бы поставить точки!!! s = s + a; //это просто так, что бы поставить точки!!! } } 

JacksonObject.java

 package com.example; import java.util.Date; public class JacksonObject { public Date DateField; public String StringField; public Double DoubleField; public int IntegerField; } 

MyJsonWrapper.java

 package com.example; import org.codehaus.jackson.JsonParser; import org.codehaus.jackson.Version; import org.codehaus.jackson.map.*; import org.codehaus.jackson.map.module.SimpleModule; import org.codehaus.jackson.map.JsonDeserializer; import org.codehaus.jackson.map.JsonSerializer; import org.codehaus.jackson.smile.*; import org.codehaus.jackson.*; import org.codehaus.jackson.map.ser.*; import org.codehaus.jackson.map.ser.std.NullSerializer; import org.codehaus.jackson.map.deser.*; import java.io.IOException; import java.lang.reflect.Type; import java.util.Date; public class MyJsonWrapper { public ObjectMapper getMyJson() { ObjectMapper mapper = new ObjectMapper(new SmileFactory()); SimpleModule module = new SimpleModule("MyModule", new Version(1, 0, 0, null)); module.addSerializer(Date.class, new JsonDateSerializer()); module.addDeserializer(Date.class, new JsonDateDeserializer()); mapper.registerModule(module); return mapper; } public class JsonDateDeserializer extends JsonDeserializer<Date> { public Date deserialize(JsonParser jp, DeserializationContext context) throws IOException, JsonProcessingException { try { String s = jp.getText().replace("/Date(", "").replace(")/", ""); if (s.equals("")) return null; boolean isDateBefore1970 = false; ............................................ if (isDateBefore1970) return new Date(-Long.valueOf(s) - offset * 60 * 1000); else return new Date(Long.valueOf(s) + offset * 60 * 1000); }catch (JsonMappingException e){ // If a JSON Mapping occurs, simply returning null instead of blocking things return null; } } } public class JsonDateSerializer extends JsonSerializer<Date> { public void serialize(Date date, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { jgen.writeString("/Date(" + date.getTime() + ")/"); } } } 

and if in MyJsonWrapper.java use static instead of public

 public class MyJsonWrapper { public static ObjectMapper getMyJson() { ObjectMapper mapper = new ObjectMapper(new SmileFactory()); SimpleModule module = new SimpleModule("MyModule", new Version(1, 0, 0, null)); module.addSerializer(Date.class, new JsonDateSerializer()); module.addDeserializer(Date.class, new JsonDateDeserializer()); mapper.registerModule(module); return mapper; } static class JsonDateDeserializer extends JsonDeserializer<Date> { public Date deserialize(JsonParser jp, DeserializationContext context) throws IOException, JsonProcessingException { try { 

it gives this error

ERROR / AndroidRuntime (314): java.lang.RuntimeException: Unable to start activity ComponentInfo {com.example / com.example.MyActivity}: java.lang.UnsupportedOperationException: Can not create generator for ......

alt text

Here is this line

JacksonObject [] mailItems2 = sss.getMyJson (). ReadValue (jacksonString, JacksonObject []. Class);

  • one
    Line number 91 in MyActivity.java where is it located? Stick a finger, then it will be at least something clear. - Barmaley
  • ATP, rendered the line - zesen
  • 2
    It is necessary to debug the mind - so on the fly on you say. Start with the demolition of your custom serializer date, put brekpoynty, overlaid with logs. Try to serialize and see which JSon string is formed. It feels like it's not a custom serializer, but just stupid that what byte value doesn't parse correctly. That is, some value is perceived not as a string, but as a number, or vice versa, a number is perceived as a string because of which deserialization falls. - Barmaley

1 answer 1

The error was here:

 ObjectMapper mapper = new ObjectMapper(new SmileFactory()); 

It is necessary so:

 ObjectMapper mapper = new ObjectMapper();