我想从我的对象生成一个JSON字符串:
Gson gson = new Gson();
String json = gson.toJson(item);
Run Code Online (Sandbox Code Playgroud)
每次我尝试这样做,我都会收到此错误:
14:46:40,236 ERROR [[BomItemToJSON]] Servlet.service() for servlet BomItemToJSON threw exception
java.lang.StackOverflowError
at com.google.gson.stream.JsonWriter.string(JsonWriter.java:473)
at com.google.gson.stream.JsonWriter.writeDeferredName(JsonWriter.java:347)
at com.google.gson.stream.JsonWriter.value(JsonWriter.java:440)
at com.google.gson.internal.bind.TypeAdapters$7.write(TypeAdapters.java:235)
at com.google.gson.internal.bind.TypeAdapters$7.write(TypeAdapters.java:220)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:200)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:96)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:60)
at com.google.gson.Gson$FutureTypeAdapter.write(Gson.java:843)
Run Code Online (Sandbox Code Playgroud)
这些是我的BomItem类的属性:
private int itemId;
private Collection<BomModule> modules;
private boolean deprecated;
private String partNumber;
private String description; //LOB
private int quantity;
private String unitPriceDollar;
private String unitPriceEuro;
private String discount;
private String totalDollar;
private …Run Code Online (Sandbox Code Playgroud) 使用Gson,我想反序列化包含惰性属性的Kotlin类.
使用Kotlin 1.0 beta 4,在对象反序列化期间出现以下错误:
Caused by: java.lang.InstantiationException: can't instantiate class kotlin.Lazy
Run Code Online (Sandbox Code Playgroud)
使用Kotlin 1.0 beta 2,我曾经用@Transient annotaiton标记该属性,告诉Gson跳过它.使用beta 4,这是不可能的,因为注释会导致编译错误.
This annotation is not applicable to target 'member property without backing field'
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何解决这个问题.有任何想法吗?
编辑:lazy属性被序列化为JSON("my_lazy_prop$delegate":{}),但这不是我想要的,因为它是从其他属性计算的.我想如果我找到一种方法来阻止该属性被序列化,那么将会修复反序列化崩溃.
这是一个简化的POJO我有:
@Entity
@Table( name = "Patient" )
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn
(
name="Discriminator",
discriminatorType=DiscriminatorType.STRING
)
@DiscriminatorValue(value="P")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Patient implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name = "ID", unique = true, nullable = false)
protected Integer ID;
@ManyToOne(targetEntity = TelephoneType.class, fetch=FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name="IDPhoneType")
protected TelephoneType phoneType;
@JsonProperty(required=false, value="phoneType")
public TelephoneType getPhoneType() {
return phoneType;
}
public void setPhoneType(TelephoneType phoneType) {
this.phoneType = phoneType;
}
}
Run Code Online (Sandbox Code Playgroud)
现在这是我的班级TelephoneType:
@Entity
@Table( name = "TelephoneType" ) …Run Code Online (Sandbox Code Playgroud) 我遇到了一个问题,即JPA在我不想要的时候试图懒洋洋地加载我的数据.基本上发生的事情是我正在使用服务来检索一些数据,当我将这些数据解析为JSON时,JSON库正在触发hibernate尝试并且懒洋洋地加载数据.有没有办法阻止这个?我在下面给出了一个例子.
// Web Controller method
public String getEmployeesByQuery(String query) {
Gson gson = new Gson();
List<Employee> employees = employeeService.findEmployeesByQuery(query);
// Here is where the problem is occurring - the gson.toJSON() method is (I imagine)
// using my getters to format the JSON output, which is triggering hibernate to
// try and lazily load my data...
return gson.toJSON(employees);
}
Run Code Online (Sandbox Code Playgroud)
是否可以将JPA/hibernate设置为不尝试并且懒惰地加载数据?
更新:我意识到你可以使用FetchType.EAGER - 但如果我不想急于加载那些数据呢?我只想阻止hibernate尝试检索更多数据 - 我已经拥有了我想要的数据.现在每当我尝试访问get()方法时,hibernate都会抛出"no session或session is closed"错误,这是有道理的,因为我的事务已经从我的服务中提交了.
谢谢!
我继承了一些代码,使用Gson将我们的应用程序状态保存为JSON,然后使用fromJson读取它.
Gson gson = createGson();
gson.fromJson(objString, myClass);
Run Code Online (Sandbox Code Playgroud)
保存的其中一个字段是位置.不幸的是,非常偶尔解析保存的数据失败,因为我保存的Location在其mExtras中包含一个mClassLoader,而Gson库无法使用此错误创建ClassLoader:
RuntimeException:无法调用受保护的java.lang.ClassLoader()而没有args
有没有人知道为什么ClassLoader被包含在我的Location的附加内容中,以及它是否应该以JSON表示结尾?
我假设我可以通过单独保存位置对象中的关键字段(例如经度,纬度,高度,时间,精度)来解决这个问题,但如果可能的话,保存位置对象会很好.
我看到有一个我可以用来排除字段的ExclusionStrategy对象,但我不确定我是否可以/应该使用它来排除我位置内的额外内容...
仅供参考,这是我的Location对象的JSON数据(改变了经度和纬度以隐藏我):
{
<snip>
"lastKnownLocation": {
"mResults": [
0,
0
],
"mProvider": "gps",
"mExtras": {
"mParcelledData": {
"mOwnObject": 1,
"mObject": 5525040
},
"mClassLoader": {
"packages": {}
},
"mMap": {},
"mHasFds": false,
"mFdsKnown": true,
"mAllowFds": true
},
"mDistance": 0,
"mTime": 1354658984849,
"mAltitude": 5.199999809265137,
"mLongitude": -122.4376,
"mLon2": 0,
"mLon1": 0,
"mLatitude": 37.7577,
"mLat1": 0,
"mLat2": 0,
"mInitialBearing": 0,
"mHasSpeed": true,
"mHasBearing": false,
"mHasAltitude": true,
"mHasAccuracy": …Run Code Online (Sandbox Code Playgroud) 我在servlet中遇到了一些麻烦,每当我在下拉菜单中更改选项时,不同的值将传递给servlet,然后导致无限循环.当我没有在下拉列表中更改选项(值没有变化)时,没有错误.
这是我的代码:
我的Javascript:
<script>
function loadStaff(){
//dropdown
var positionDropDown = document.getElementById("positionsDropdown");
//value of the drop down
var positionID = positionDropDown.options[positionDropDown.selectedIndex].value;
$.getJSON('loadStaff?positionID=' + positionID, function(data) {
-- no populate code yet
});
}
</script>
Run Code Online (Sandbox Code Playgroud)
我的AjaxServlet:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String userPath = request.getServletPath();
if (userPath.equals("/loadStaff")) {
String positionID = request.getParameter("positionID");
Position position = positionFacade.find(Integer.parseInt(positionID));
Collection staffCollection = position.getStaffCollection();
List<Staff> staffList = new ArrayList(staffCollection);
String staffListJson = new Gson().toJson(staffList);
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.getWriter().write(staffListJson);
}
}
Run Code Online (Sandbox Code Playgroud)
在debuggig.错误出现在:
String …Run Code Online (Sandbox Code Playgroud) 我正在使用Retrofit向我的服务器发送和接收请求.
我有一个类似下面的模型,我必须将它发送到我的服务器,但这个模型中的一些变量不能发送到服务器.
public class SelectedListModel implements Serializable {
@SerializedName("p_id")
@Expose
private Long pId;
@SerializedName("p_qty")
@Expose
private Double pQty;
@Expose(serialize = false , deserialize = false)
private String pName; //Have not to send to server
@Expose(serialize = false , deserialize = false)
private String pPrice; //Have not to send to server
@Expose(serialize = false , deserialize = false)
private String pImageUrl; //Have not to send to server
}
Run Code Online (Sandbox Code Playgroud)
因此,我从服务器得到的回复是400.我用它@Expose(serialize = false, deserialize = false)来忽略那些没有发送到服务器的变量.但它不起作用.有没有办法做到这一点,或者我必须为我的服务器创建另一个模型?
我看到了几个类似的问题,但没有一个对我有用的答案。我正在努力将现有项目转换为使用 Hibernate。我使用 Mysql 作为数据库。我有一堂这样的课:
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
private Long userId;
@ManyToOne
@JoinColumn(name = "group_id_user")
private Group group;
@Column(name = "name")
private String name;
...
// getters and setters....
}
Run Code Online (Sandbox Code Playgroud)
和这样的类:
@Entity
@Table(name = "group")
public class Group {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "group_id")
private Long groupId;
@Column(name="group_name")
private String groupName;
...
// getters and setters....
}
Run Code Online (Sandbox Code Playgroud)
User当我从数据库中获取项目时,我将其转换为 JSON 并最终得到以下格式的结果:
{
"user": {
"userId": 1,
"group": …Run Code Online (Sandbox Code Playgroud) 我有一个类Item(见下文),其中我使用了一些Room db注释.它还有一个名为ItemInfo的嵌套类.这两个类都有一个空构造函数.
问题是,当我尝试序列化Item类的对象时,应用程序崩溃时出现以下错误:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.android.carrymates, PID: 18526
java.lang.SecurityException: Can not make a java.lang.reflect.Method constructor accessible
at java.lang.reflect.AccessibleObject.setAccessible0(AccessibleObject.java:133)
at java.lang.reflect.AccessibleObject.setAccessible(AccessibleObject.java:119)
at com.google.gson.internal.reflect.PreJava9ReflectionAccessor.makeAccessible(PreJava9ReflectionAccessor.java:31)
at com.google.gson.internal.ConstructorConstructor.newDefaultConstructor(ConstructorConstructor.java:103)
at com.google.gson.internal.ConstructorConstructor.get(ConstructorConstructor.java:85)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:101)
at com.google.gson.Gson.getAdapter(Gson.java:458)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
at com.google.gson.Gson.getAdapter(Gson.java:458)
at com.google.gson.internal.bind.ArrayTypeAdapter$1.create(ArrayTypeAdapter.java:48)
at com.google.gson.Gson.getAdapter(Gson.java:458)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
at com.google.gson.Gson.getAdapter(Gson.java:458)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
at com.google.gson.Gson.getAdapter(Gson.java:458)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
at com.google.gson.Gson.getAdapter(Gson.java:458)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
at com.google.gson.Gson.getAdapter(Gson.java:458)
at com.google.gson.Gson.toJson(Gson.java:696)
at …Run Code Online (Sandbox Code Playgroud) gson ×7
java ×7
android ×3
hibernate ×3
jpa ×2
json ×2
android-room ×1
annotations ×1
javascript ×1
jersey-2.0 ×1
kotlin ×1
lazy-loading ×1
location ×1
object ×1
retrofit2 ×1
servlets ×1