content: package com.alibaba.json.bvt.bug;
  
  import com.alibaba.fastjson.JSON;
  import com.alibaba.fastjson.JSONObject;
  import com.alibaba.fastjson.annotation.JSONField;
  import com.alibaba.fastjson.serializer.JSONSerializer;
  import com.alibaba.fastjson.serializer.MapSerializer;
  import com.alibaba.fastjson.serializer.ObjectSerializer;
  import junit.framework.TestCase;
  import org.junit.Assert;
  
  import java.io.IOException;
  import java.lang.reflect.Type;
  import java.util.HashMap;
  import java.util.Map;
  import java.util.TreeMap;
  
  /**
   * Created by wenshao on 10/01/2017.
   */
  public class Issue989 extends TestCase {
  
      public void test_for_issue() throws Exception {
          assertEquals(
                  JSON.toJSONString(getMyObject(new HashMap<String, Name>())),
                  JSON.toJSONString(getMyObject(new TreeMap<String, Name>()))
          );
      }
  
      private static MyObject getMyObject(Map<String, Name> names) {
          MyObject mapObj = new MyObject();
          mapObj.setNames(names);
          Name name = new Name();
          name.setFirst("foo");
          name.setSecond("boo");
          names.put("mock", name);
          return mapObj;
      }
  
      public static class NameMapCodec implements ObjectSerializer {
  
          public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
              JSONObject names = new JSONObject();
              for(Map.Entry<String, Name> entry :
                      ((Map<String, Name>)object).entrySet()) {
                  Name name = entry.getValue();
                  names.put(entry.getKey(), name.getFirst() + ":" + name.getSecond());
              }
              MapSerializer.instance.write(serializer, names, fieldName, JSONObject.class, features);
          }
  
      }
  
      public static class MyObject {
  
          @JSONField(serializeUsing = NameMapCodec.class)
          private Map<String, Name> names;
  
          public Map<String, Name> getNames() {
              return names;
          }
  
          public void setNames(Map<String, Name> names) {
              this.names = names;
          }
  
      }
  
      private static class Name {
  
          private String first;
  
          private String second;
  
          public String getFirst() {
              return first;
          }
  
          public void setFirst(String first) {
              this.first = first;
          }
  
          public String getSecond() {
              return second;
          }
  
          public void setSecond(String second) {
              this.second = second;
          }
      }
  }
  