从Postgre中将字符串解析为json数组

时间:2017-08-18 11:51:57

标签: json postgresql hibernate spring-mvc jpa

我在PostgreSQL中有一个包含2列的表--Id和coord。 专栏" coord" - 以JSON格式存储为字符串的地理坐标。

示例:

[{"lat":49.09693425316379,"lng":33.61747393628419},{"lat":49.11835977646441,"lng":33.638456496907},{"lat":49.12103137811804,"lng":33.63866144845382},{"lat":49.09694682809236,"lng":33.61746879914138},{"lat":49.08920750204137,"lng":33.61734796797724},{"lat":49.07643862058337,"lng":33.61246117651179}]

如何发送此类字符串作为JSON对象数组(POST请求)。

没有getter和setter的实体

public class Lepcoord implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 30)
@Column(name = "tplnr")
private String tplnr;
@Size(max = 2147483647)
@Column(name = "coord")
private String coord;

控制器

@POST
@RequestMapping(value= "/lep/{voltage}", method = RequestMethod.POST, headers = "Accept=application/json")
@ResponseBody
public ResponseEntity<List<Lepcoord>> lep (@PathVariable  String voltage) 
{
    return new ResponseEntity<>(gisDaoService.lep(voltage), HttpStatus.OK);
}

服务

 @Transactional(readOnly = true)
    public List <Lepcoord> lep (String voltage) {
         Query  query = this.em.createQuery(    
             " From Lepcoord ");   
    List <Lepcoord> rez = null;
        try {
                rez = (List<Lepcoord>) query.getResultList();
            } catch (PersistenceException r) {
                return null;
            }
            return rez;
        }

Hibernate无法处理json类型如果我将coord存储为Postgre中的json。可能有人知道更简单的方法。不要编写自己的类来使用Postgres json类型

2 个答案:

答案 0 :(得分:0)

Postgres支持这里应该有用的json_to_array函数。在这里查看documentation。 或者,SO上有这个答案:How to turn a json array into rows in postgres可以指向正确的方向。

答案 1 :(得分:0)

您正在使用Hibernate,因此最好使用知道如何处理json的自定义UserType。

  1. 创建一个hibernate usertype

    public class GeoJsonType implements UserType
    
    {
    
        protected static final int[] SQL_TYPES = { java.sql.Types.VARCHAR };
    
        @Override
        public int[] sqlTypes()
        {
            return SQL_TYPES;
        }
    
        @Override
        public Class returnedClass()
        {
            return GeoEntity.class;
        }
    
        @Override
        public boolean equals(Object x, Object y) throws HibernateException
        {
            if (x == y)
            {
                return true;
            }
            else if (x == null || y == null)
            {
                return false;
            }
            else
            {
                return x.equals(y);
            }
        }
    
        @Override
        public int hashCode(Object x) throws HibernateException
        {
            return x.hashCode();
        }
    
        @Override
        public Object nullSafeGet(ResultSet rs, String[] names, Object owner)     throws HibernateException, SQLException
    
        {
    
    //        if (rs.wasNull())
    //        {
    //            return null;
    //        }
    
        //this is your json stored in db
    
            String rsArr = rs.getString(names[0]);
    
            if (rsArr == null)
                return null;        
            GeoEntity detailAttr = JSON.toObject(rsArr, GeoEntity.class, null);
            return detailAttr;
        }
    
        @Override
        public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException
        {
            if (value == null)
            {
                st.setNull(index, SQL_TYPES[0]);
            }
            else
            {
                //when stroing object into db convert it to json
                GeoEntity castObject = (GeoEntity) value;
                String json = JSON.toJson(castObject);
                st.setString(index, json);
            }
        }
    
        @Override
        public Object deepCopy(Object value) throws HibernateException
        {
            return value;
        }
    
        @Override
        public boolean isMutable()
        {
            return true;
        }
    
        @Override
        public Serializable disassemble(Object value) throws HibernateException
        {
            return null;
        }
    
        @Override
        public Object assemble(Serializable cached, Object owner) throws HibernateException
        {
            return null;
        }
    
        @Override
        public Object replace(Object original, Object target, Object owner) throws HibernateException
        {
            return original;
        }
    
    }
    
  2. 您的Entity.java

    @Type(type =&#34; FQN到您的GeoJsonType&#34;)

    @Column(name =&#34; geo&#34;)

    public GeoEntity getGeo()

    {

    返回地理位置;

    }