我使用avro工具从avsc文件生成java类,使用:
java.exe -jar avro-tools-1.7.7.jar compile -string schema myfile.avsc
然后,我试图通过ObjectMapper将这些对象序列化为json,但总是得到一个JsonMappingException,上面写着“不是枚举”或“不是联合”。在我的测试中,我使用其生成器或构造函数创建生成的对象。我对不同类的对象有这样的例外。。。
示例代码:
ObjectMapper serializer = new ObjectMapper(); // com.fasterxml.jackson.databind
serializer.register(new JtsModule()); // com.bedatadriven.jackson.datatype.jts
...
return serializer.writeValueAsBytes(avroConvertedObject); // => JsonMappingException
我还使用:serializer尝试了许多配置。配置(…)但还是失败了。版本:Java 1.8、jackson datatype jts 2.3、jackson core 2.6.5、jackson databind 2.6.5、jackson annotations 2.6.5
有什么建议吗?谢谢
我的req'ts发生了变化,我被告知需要将Avro对象直接转换为JSON,而不保留任何元数据。我在这里的另一个答案是指定一个方法convertToJsonString将整个Avro对象转换为JSON,以便使用反编码器可以将原始Avro对象重新创建为Avro对象。这不是我的mgt。我不再需要了,所以我又回到了原来的画板上。
作为万福玛利亚通行证,我尝试使用Gson,它可以做我现在必须做的事情。很简单:
Gson gson = new Gson();
String theJsonString = gson.toJson(object_ur_converting);
你就完了。
在以下位置找到代码示例后https://www.programcreek.com/java-api-examples/?api=org.apache.avro.io.JsonEncoder我编写了一个方法,可以将任何给定的Avro对象(它们扩展了GenericRecord)转换为Json字符串。代码:
import org.apache.avro.generic.GenericDatumWriter;
import org.apache.avro.generic.GenericRecord;
import org.apache.avro.io.DatumWriter;
import org.apache.avro.io.EncoderFactory;
import org.apache.avro.io.JsonEncoder;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
// ... Class header etc. ...
public static <T extends GenericRecord> String convertToJsonString(T event) throws IOException {
String jsonstring = "";
try {
DatumWriter<T> writer = new GenericDatumWriter<T>(event.getSchema());
OutputStream out = new ByteArrayOutputStream();
JsonEncoder encoder = EncoderFactory.get().jsonEncoder(event.getSchema(), out);
writer.write(event, encoder);
encoder.flush();
jsonstring = out.toString();
} catch (IOException e) {
log.error("IOException occurred.", e);
throw e;
}
return jsonstring;
}
如果架构成员确实是这种情况(我们没有看到完整的错误消息),那么您可以将其关闭。我用mixin来做这件事,就像这样:
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.apache.avro.Schema;
import org.junit.Test;
import java.io.File;
import java.io.IOException;
public class AvroGenerTests
{
abstract class IgnoreSchemaProperty
{
// You have to use the correct package for JsonIgnore,
// fasterxml or codehaus
@JsonIgnore abstract void getSchema();
}
@Test
public void writeJson() throws IOException {
BookAvro b = BookAvro.newBuilder()
.setTitle("Wilk stepowy")
.setAuthor("Herman Hesse")
.build();
ObjectMapper om = new ObjectMapper();
om.enable(SerializationFeature.INDENT_OUTPUT);
om.addMixIn(BookAvro.class, IgnoreSchemaProperty.class);
om.writeValue(new File("plik_z_gen.json"), b);
}
}
问题内容: 如何在JavaScript中将对象序列化为JSON? 问题答案: 您正在寻找。
问题内容: 因此,当我偶然发现新的JsonSerializable Interface 时,我在php.net上四处徘徊,以获取有关将PHP对象序列化为JSON的信息。它只是 PHP > = 5.4,而我正在5.3.x环境中运行。 PHP <5.4如何实现这种功能? 我还没有使用JSON进行很多工作,但是我试图在应用程序中支持API层,并且将数据对象( 否则将发送到视图 )转储到JSON中将是完美
问题内容: 我需要转换从REST API获得的JSON数据,并将其转换为CSV以便进行分析。问题在于JSON数据不一定遵循相同的内容,因此我无法定义映射类型。这已经成为一项挑战,占用了我太多时间。我已经创建了一些代码,但是由于它在此行上引发了异常,因此它当然不起作用 错误是: 附加信息:无法将当前JSON对象(例如{“ name”:“ value”})反序列化为类型’System.Collecti
问题内容: 我需要将一些对象序列化为JSON并发送到WebService。如何使用org.json库?否则我将不得不使用另一个?这是我需要序列化的类: 我只放了类的变量和构造函数,但也有getter和setter方法。所以如果有人可以帮忙 问题答案: 没有注释的简单方法是使用Gson库 就那么简单:
问题内容: 我在使用AJAX访问的Java服务器应用程序中有一个字符串。它看起来像以下内容: 当从服务器提取字符串时,是否有一种简单的方法可以将其转换为活动的JavaScript对象(或数组)?还是我必须手动拆分字符串并手动构建对象? 问题答案: 现代浏览器支持。 在不浏览器,您可以包括在库中。
问题内容: 我需要将Objective- C对象序列化和反序列化为JSON以存储在CouchDB中。人们是否有通用解决方案最佳实践的示例代码?我看了几个JSON框架,它们在NSDictionary / NSArray级别停止了。即,许多框架会将NSDictionary / NSArray序列化和反序列化为JSON。但是我仍然要做将NSDictionary转换为Objective-C对象的工作。 为