Java JSON对象扁平化

Java JSON对象扁平化,java,json,Java,Json,我正在寻找一个Java库来将我的域对象转换成扁平的JSON 例如 我研究了XStream、EclipseMoxy、FlexJSON、JSON库和gson 我的目标是摆脱json包装类并最小化代码。我希望有一个通用服务,它可以接受我拥有的任何域模型类并获得json表示,而不必为每种类型的模型编写xml描述符或任何自定义转换器。对于我的模型,深度为1级就足够了。我还没有在上述库中找到使用注释或内置功能的简单通用解决方案,但我可能忽略了它们。是否有一个非侵入性的库可以做到这一点?或者是我列出的那个?我

我正在寻找一个Java库来将我的域对象转换成扁平的JSON

例如

我研究了XStream、EclipseMoxy、FlexJSON、JSON库和gson


我的目标是摆脱json包装类并最小化代码。我希望有一个通用服务,它可以接受我拥有的任何域模型类并获得json表示,而不必为每种类型的模型编写xml描述符或任何自定义转换器。对于我的模型,深度为1级就足够了。我还没有在上述库中找到使用注释或内置功能的简单通用解决方案,但我可能忽略了它们。是否有一个非侵入性的库可以做到这一点?或者是我列出的那个?我使用的是Hibernate,所以库必须能够处理CGLib代理

我已经简单地使用了GSON,我认为它可以满足您的需要。在调查的过程中,我想出了下面这个可笑的简单例子来证实它是我所需要的那么简单;首先,POJO:

import java.util.List;

public class Member {

    private String name;
    private int age;
    private List<String> stuff;

    public Member() {
    }

    public String getName() {
        return name;
    }

    public void setName( String name ) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge( int age ) {
        this.age = age;
    }

    public List<String> getStuff() {
        return stuff;
    }

    public void setStuff( List<String> stuff ) {
        this.stuff = stuff;
    }

}
import java.util.List;
公共班级成员{
私有字符串名称;
私人互联网;
私人物品清单;
公职人员(){
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共整数getAge(){
回归年龄;
}
公共无效设置(整数){
这个。年龄=年龄;
}
公共列表getStuff(){
归还物品;
}
公共空集凝灰岩(列表材料){
this.stuff=东西;
}
}
然后,工人阶级:

import java.util.ArrayList;
import java.util.List;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class Main {

    public static void main( String[] args ) {
        Main m = new Main();
        m.execute( args );
    }

    private void execute( String[] args ) {
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        Member member = new Member();

        List<String> stuff = new ArrayList<String>();
        stuff.add( "shoes" );
        stuff.add( "hat" );
        member.setStuff( stuff );
        member.setName( "Bert" );
        member.setAge( 21 );

        String output = gson.toJson( member, Member.class );
        log( output );

        Member member2 = gson.fromJson( output, Member.class );
        log(member2.getName());
    }

    private void log( String text ) {
        System.out.println( text );
    }

}
import java.util.ArrayList;
导入java.util.List;
导入com.google.gson.gson;
导入com.google.gson.GsonBuilder;
公共班机{
公共静态void main(字符串[]args){
Main m=新的Main();
m、 执行(args);
}
私有void execute(字符串[]args){
Gson Gson=new GsonBuilder().setPrettyPrinting().create();
成员=新成员();
List stuff=new ArrayList();
添加(“鞋”);
添加(“帽子”);
成员:setStuff(材料);
成员:setName(“Bert”);
成员:setAge(21);
字符串输出=gson.toJson(member,member.class);
日志(输出);
Member member2=gson.fromJson(输出,Member.class);
日志(member2.getName());
}
专用作废日志(字符串文本){
System.out.println(文本);
}
}

不需要xml描述符或自定义转换器。这就是你想要的东西吗?

注意:我是专家组的负责人和成员

下面是一个示例,说明了如何通过利用
@XmlPath
扩展在MOXy中实现这一点

package forum7652387;

import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlAccessorType(XmlAccessType.FIELD)
public class Person {
    String name;

    @XmlPath(".")
    Address homeAddress;
}
地址

package forum7652387;

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class Address {
    @XmlElement(name="homeAddress_street")
    String street;

    @XmlElement(name="homeAddress_zip")
    String zip;
}
jaxb.properties

package forum7652387;

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class Address {
    @XmlElement(name="homeAddress_street")
    String street;

    @XmlElement(name="homeAddress_zip")
    String zip;
}
要将MOXy指定为JAXB提供程序,您需要在与域类相同的包中添加一个名为
JAXB.properties
的文件,并使用以下条目:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
演示

package forum7652387;

import java.io.StringReader;
import javax.xml.bind.*;
import javax.xml.transform.stream.StreamSource;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Person.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        unmarshaller.setProperty("eclipselink.media-type", "application/json");
        unmarshaller.setProperty("eclipselink.json.include-root", false);
        String jsonString = "{\"name\":\"John\", \"homeAddress_street\":\"123 Street\", \"homeAddress_zip\":\"xxxxx\"}";
        StreamSource jsonSource = new StreamSource(new StringReader(jsonString));
        Person person = unmarshaller.unmarshal(jsonSource, Person.class).getValue();

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty("eclipselink.media-type", "application/json");
        marshaller.setProperty("eclipselink.json.include-root", false);
        marshaller.marshal(person, System.out);
    }

}
输出

 {"name" : "John", "homeAddress_street" : "123 Street", "homeAddress_zip" : "xxxxx"}
了解更多信息

package forum7652387;

import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlAccessorType(XmlAccessType.FIELD)
public class Person {
    String name;

    @XmlPath(".")
    Address homeAddress;
}

如何展平阵列?如何展平模型?您的示例模型不是由任何其他域对象组成的,如果
同时拥有
家庭地址
工作地址
?@TomAnderson-我已经输入了支持此用例的增强请求。请随意添加更多细节:我想你已经说了所有需要说的话!有没有可能在不注释每个类中的每个字段的情况下,将反射与Moxy一起使用来完成此操作?