वास्तविक प्रश्न में वर्णित डेटा संरचना को क्रमबद्ध करने का प्रयास करते समय जीसन वास्तव में एक परिपत्र संदर्भ त्रुटि के बारे में शिकायत करता है।
निम्नलिखित उदाहरण इस बिंदु को दर्शाता है।
import com.google.gson.Gson;
public class GsonFoo
{
public static void main(String[] args)
{
MyBean bean = new MyBean();
bean.data = "some data";
bean.problem = new RuntimeException("Ack!");
System.out.println(new Gson().toJson(bean));
}
}
class MyBean
{
public String data;
public Exception problem;
}
इस उदाहरण के परिणामस्वरूप जीसन से निम्नलिखित अपवाद और संदेश में परिणाम मिलता है।
Exception in thread "main" java.lang.IllegalStateException: circular reference error
Offending field: cause
Offending object: preserveType: false, type: class java.lang.Throwable, obj: java.lang.RuntimeException: Ack!
at com.google.gson.CircularReferenceException.createDetailedException(CircularReferenceException.java:43)
at com.google.gson.JsonSerializationVisitor.visitObjectField(JsonSerializationVisitor.java:117)
...
जीसन इसी प्रकार के रूप में सरल कुछ करने का प्रयास करते समय इसी तरह चोक करता है।
System.out.println(new Gson().toJson(new RuntimeException("Ack!")));
जीसन वर्तमान में इस समस्या को हल करने के लिए कॉन्फ़िगरेशन उपलब्ध नहीं है। मैं http://code.google.com/p/google-gson/issues/list पर किसी समस्या को लॉग करने की अनुशंसा करता हूं।
यदि Exception
संदर्भ वाला कोई ऑब्जेक्ट क्रमबद्ध होना चाहिए और यदि जीसन का उपयोग किया जाना चाहिए, तो Exception
संदर्भ के लिए कस्टम क्रमबद्धीकरण प्रक्रिया लागू की जानी चाहिए। निम्नलिखित एक उदाहरण है।
import java.lang.reflect.Type;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
public class GsonFoo
{
public static void main(String[] args)
{
MyBean bean = new MyBean();
bean.data = "some data";
bean.problem = new RuntimeException("Ack!");
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Exception.class, new ExceptionSerializer());
Gson gson = gsonBuilder.create();
System.out.println(gson.toJson(bean));
}
}
class ExceptionSerializer implements JsonSerializer<Exception>
{
@Override
public JsonElement serialize(Exception src, Type typeOfSrc, JsonSerializationContext context)
{
JsonObject jsonObject = new JsonObject();
jsonObject.add("cause", new JsonPrimitive(String.valueOf(src.getCause())));
jsonObject.add("message", new JsonPrimitive(src.getMessage()));
return jsonObject;
}
}
class MyBean
{
public String data;
public Exception problem;
}
उत्पादन:
{"data":"some data","problem":{"cause":"null","message":"Ack!"}}
क्या इसके लायक है के लिए, Jackson इसी तरह गला घोंटना नहीं है जब एक ही डेटा संरचना को क्रमानुसार करने का प्रयास कर रहा। जैक्सन ने निम्नानुसार JSON को MyBean
इंस्टेंस का क्रमबद्ध किया है।
{
"data":"some data",
"problem":
{
"cause":null,
"message":"Ack!",
"localizedMessage":"Ack!",
"stackTrace":
[
{
"className":"com.stackoverflow.q8151082.JacksonFoo",
"fileName":"JacksonFoo.java",
"lineNumber":11,
"methodName":"main",
"nativeMethod":false
}
]
}
}
किसी ऑब्जेक्ट को org.apache.log4j.Logger फ़ील्ड के साथ क्रमबद्ध करने का प्रयास करते समय मुझे एक ही समस्या का अनुभव हुआ। –