[ https://issues.apache.org/jira/browse/AVRO-3001?focusedWorklogId=803098&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-803098 ]
ASF GitHub Bot logged work on AVRO-3001: ---------------------------------------- Author: ASF GitHub Bot Created on: 24/Aug/22 04:44 Start Date: 24/Aug/22 04:44 Worklog Time Spent: 10m Work Description: rayokota commented on code in PR #1833: URL: https://github.com/apache/avro/pull/1833#discussion_r953338043 ########## lang/csharp/src/apache/main/IO/JsonEncoder.cs: ########## @@ -0,0 +1,356 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Avro.IO.Parsing; +using System.Collections; +using System.IO; +using System.Text; +using Newtonsoft.Json; + +namespace Avro.IO +{ + /// <summary> + /// An <see cref="Encoder"/> for Avro's JSON data encoding. + /// + /// JsonEncoder buffers output, and data may not appear on the output until + /// <see cref="Encoder.Flush()"/> is called. + /// + /// JsonEncoder is not thread-safe. + /// </summary> + public class JsonEncoder : ParsingEncoder, Parser.IActionHandler + { + private readonly Parser parser; + private JsonWriter writer; + private bool includeNamespace = true; + + // Has anything been written into the collections? + private readonly BitArray isEmpty = new BitArray(64); + + /// <summary> + /// Initializes a new instance of the <see cref="JsonEncoder"/> class. + /// </summary> + public JsonEncoder(Schema sc, Stream stream) : this(sc, getJsonWriter(stream, false)) + { + } + + /// <summary> + /// Initializes a new instance of the <see cref="JsonEncoder"/> class. + /// </summary> + public JsonEncoder(Schema sc, Stream stream, bool pretty) : this(sc, getJsonWriter(stream, pretty)) + { + } + + /// <summary> + /// Initializes a new instance of the <see cref="JsonEncoder"/> class. + /// </summary> + public JsonEncoder(Schema sc, JsonWriter writer) + { + Configure(writer); + this.parser = new Parser((new JsonGrammarGenerator()).Generate(sc), this); + } + + /// <inheritdoc /> + public override void Flush() + { + parser.ProcessImplicitActions(); + if (writer != null) + { + writer.Flush(); + } + } + + // by default, one object per line. + // with pretty option use default pretty printer with root line separator. + private static JsonWriter getJsonWriter(Stream stream, bool pretty) + { + JsonWriter writer = new JsonTextWriter(new StreamWriter(stream)); + if (pretty) + { + writer.Formatting = Formatting.Indented; + } + + return writer; + } + + /// <summary> + /// Whether to include the namespace. + /// </summary> + public virtual bool IncludeNamespace Review Comment: Done ########## lang/csharp/src/apache/main/IO/Parsing/JsonGrammarGenerator.cs: ########## @@ -0,0 +1,106 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; + +namespace Avro.IO.Parsing +{ + /// <summary> + /// The class that generates a grammar suitable to parse Avro data in JSON + /// format. + /// </summary> + public class JsonGrammarGenerator : ValidatingGrammarGenerator + { + /// <summary> + /// Returns the non-terminal that is the start symbol for the grammar for the + /// grammar for the given schema <tt>sc</tt>. Review Comment: Done Issue Time Tracking ------------------- Worklog Id: (was: 803098) Time Spent: 4h 20m (was: 4h 10m) > JsonEncode Decode support for C# > -------------------------------- > > Key: AVRO-3001 > URL: https://issues.apache.org/jira/browse/AVRO-3001 > Project: Apache Avro > Issue Type: Improvement > Components: csharp > Affects Versions: 1.10.0, 1.11.0 > Reporter: Krishnan Unni > Assignee: Robert Yokota > Priority: Major > Labels: pull-request-available > Time Spent: 4h 20m > Remaining Estimate: 0h > > The C# library for avro currently supports only the Binary encoding and also > with compile time types (Generic support only). As part of a project I am > doing I need to validate the avro schema against the incoming json data on > the fly without a predefined type (generated class). So basically comparing > an avro schema (string/json representation) against a raw json string. It is > possible with the Java library since it supports both non generic types and > streams as well as json encoding. With C# currently this is not possible. Is > there a plan to extend the C# library to provide these features? If yes, is > there a timeline? If not is there any alternative to achieve this? -- This message was sent by Atlassian Jira (v8.20.10#820010)