Skip to content

Commit a2b8405

Browse files
authored
Merge pull request #4 from BizTalkComponents/fix-JsonEncoder
Fix JSONEncoder to generate empty array if the input array has no ele…
2 parents 4403f3d + c20474e commit a2b8405

File tree

7 files changed

+119
-44
lines changed

7 files changed

+119
-44
lines changed

Tests/UnitTests/JSONEncoderTester.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public void TestEmptyRootNodeJSONEncoder()
6262
var stream = new StreamReader(output.BodyPart.GetOriginalDataStream(), Encoding.UTF8);
6363
var retStr = stream.ReadToEnd();
6464
var JsonObj = Newtonsoft.Json.JsonConvert.DeserializeObject(retStr);
65-
Assert.IsFalse(JsonObj is Newtonsoft.Json.Linq.JArray);
65+
Assert.IsTrue(JsonObj is Newtonsoft.Json.Linq.JArray);
6666
}
6767

6868
[TestMethod]

src/CustomJSONCoders/BizTalkComponents.PipelineComponents.CustomJsonCoders.csproj

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@
6060
<HintPath>C:\Windows\assembly\GAC_MSIL\Microsoft.BizTalk.Streaming\3.0.1.0__31bf3856ad364e35\Microsoft.BizTalk.Streaming.dll</HintPath>
6161
</Reference>
6262
<Reference Include="Microsoft.XLANGs.BaseTypes, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
63+
<Reference Include="Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
64+
<HintPath>..\..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
65+
<Private>True</Private>
66+
</Reference>
6367
<Reference Include="System" />
6468
<Reference Include="System.ComponentModel.DataAnnotations" />
6569
<Reference Include="System.Core" />
@@ -75,6 +79,7 @@
7579
<Compile Include="BiztalkComponents.Utils\RequiredRuntimeAttribute.cs" />
7680
<Compile Include="BiztalkComponents.Utils\ValidationHelper.cs" />
7781
<Compile Include="Internal\EncapsulatorStream.cs" />
82+
<Compile Include="Internal\JSONModifier.cs" />
7883
<Compile Include="Internal\XmlArrayDetectorStream.cs" />
7984
<Compile Include="JSONDecoder.cs" />
8085
<Compile Include="JSONDecoder.Components.cs" />

src/CustomJSONCoders/BizTalkComponents.PipelineComponents.CustomJsonCoders.nuspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<package >
33
<metadata>
44
<id>BizTalkComponents.PipelineComponents.CustomJsonCoders</id>
5-
<version>1.0.3</version>
5+
<version>1.0.4</version>
66
<title>Custom Json Coders</title>
77
<authors>Wael Alissa</authors>
88
<owners>Wael Alissa</owners>
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.IO;
4+
using System.Linq;
5+
using System.Text;
6+
using System.Threading.Tasks;
7+
using Newtonsoft.Json;
8+
namespace BizTalkComponents.PipelineComponents.CustomJsonCoders.Internal
9+
{
10+
internal static class JSONModifier
11+
{
12+
internal static Stream ConvertToJArray(JsonTextReader reader, bool rootArray = true)
13+
{
14+
var ms = new MemoryStream();
15+
var writer = new JsonTextWriter(new StreamWriter(ms, Encoding.UTF8));
16+
while (reader.Read())
17+
{
18+
var tokenType = reader.TokenType;
19+
var depth = reader.Depth;
20+
if (rootArray)
21+
{
22+
if (depth == 0 & tokenType == JsonToken.StartObject)
23+
{
24+
writer.WriteStartArray();
25+
}
26+
else if (depth==0 & tokenType ==JsonToken.String)
27+
{
28+
writer.WriteStartArray();
29+
writer.WriteEndArray();
30+
break;
31+
}
32+
else if (depth == 1 &
33+
(tokenType == JsonToken.StartArray
34+
| tokenType == JsonToken.EndArray
35+
| tokenType == JsonToken.PropertyName))
36+
{
37+
38+
}
39+
else if (depth == 0 & tokenType == JsonToken.EndObject)
40+
{
41+
writer.WriteEndArray();
42+
}
43+
else
44+
WriteJson(reader, writer);
45+
}
46+
}
47+
reader.Close();
48+
writer.Flush();
49+
ms.Seek(0, SeekOrigin.Begin);
50+
return ms;
51+
}
52+
private static void WriteJson(JsonTextReader reader, JsonTextWriter writer)
53+
{
54+
switch (reader.TokenType)
55+
{
56+
case JsonToken.None:
57+
break;
58+
case JsonToken.StartObject:
59+
writer.WriteStartObject();
60+
break;
61+
case JsonToken.StartArray:
62+
writer.WriteStartArray();
63+
break;
64+
case JsonToken.StartConstructor:
65+
break;
66+
case JsonToken.PropertyName:
67+
writer.WritePropertyName((string)reader.Value);
68+
break;
69+
case JsonToken.Comment:
70+
writer.WriteComment((string)reader.Value);
71+
break;
72+
case JsonToken.Raw:
73+
break;
74+
case JsonToken.Integer:
75+
case JsonToken.Float:
76+
case JsonToken.String:
77+
case JsonToken.Boolean:
78+
case JsonToken.Date:
79+
case JsonToken.Bytes:
80+
writer.WriteValue(reader.Value);
81+
break;
82+
case JsonToken.Null:
83+
writer.WriteNull();
84+
break;
85+
case JsonToken.Undefined:
86+
writer.WriteUndefined();
87+
break;
88+
case JsonToken.EndObject:
89+
writer.WriteEndObject();
90+
break;
91+
case JsonToken.EndArray:
92+
writer.WriteEndArray();
93+
break;
94+
case JsonToken.EndConstructor:
95+
break;
96+
default:
97+
break;
98+
}
99+
}
100+
}
101+
102+
}

src/CustomJSONCoders/Internal/XmlArrayDetectorStream.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@
88
using System.Xml;
99
namespace BizTalkComponents.PipelineComponents.CustomJsonCoders.Internal
1010
{
11-
class XmlArrayDetectorStream : XmlTranslatorStream
11+
internal class XmlArrayDetectorStream : XmlTranslatorStream
1212
{
13-
13+
internal bool HasRootNodeChildren { get; private set; }
1414
public bool IsFirstLevelArray
1515
{
1616
get
@@ -33,6 +33,7 @@ protected override void TranslateEndElement(bool full)
3333
{
3434
if (m_reader.Depth == 1)
3535
{
36+
HasRootNodeChildren = true;
3637
if (string.IsNullOrEmpty(m_arrayNodeName))
3738
{
3839
m_arrayNodeName = m_reader.LocalName;

src/CustomJSONCoders/JSONEncoder.cs

Lines changed: 6 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -59,47 +59,13 @@ public IBaseMessage Execute(IPipelineContext pContext, IBaseMessage pInMsg)
5959
RemoveOuterEnvelope = this.RemoveOuterEnvelope | ArrayOutput
6060
};
6161
jencoder.Execute(pContext, pInMsg);
62-
if (ArrayOutput & data.IsFirstLevelArray)
62+
if (ArrayOutput & (data.IsFirstLevelArray | !data.HasRootNodeChildren))
6363
{
64-
var reader = pInMsg.BodyPart.GetOriginalDataStream();
65-
var writer = new MemoryStream();
66-
long streamLength = reader.Length;
67-
68-
int offset = 0, bytesToRead = buffLength, curPos = 0, firstChar = -1;
69-
var buff = new byte[buffLength];
70-
int bytesRead = reader.Read(buff, 0, bytesToRead);
71-
curPos += bytesRead;
72-
while (offset < bytesRead & buff[offset] != ':')
73-
{
74-
if (firstChar < 0 & buff[offset] == '{')
75-
firstChar = offset;
76-
offset++;
77-
}
78-
writer.Write(buff, 0, firstChar);
79-
offset++;
80-
bytesRead = bytesRead - offset;
81-
bool skipReading = true;
82-
while (skipReading | curPos < streamLength)
83-
{
84-
if (!skipReading)
85-
{
86-
if (streamLength - curPos < buffLength)
87-
bytesToRead = (int)(streamLength - curPos);
88-
else
89-
bytesToRead = buffLength;
90-
bytesRead = reader.Read(buff, 0, bytesToRead);
91-
curPos += bytesRead;
92-
}
93-
if (curPos == streamLength & bytesRead > 0)
94-
bytesRead--;
95-
writer.Write(buff, offset, bytesRead);
96-
skipReading = false;
97-
offset = 0;
98-
}
99-
writer.Flush();
100-
writer.Seek(0, SeekOrigin.Begin);
101-
pInMsg.BodyPart.Data = writer;
102-
pContext.ResourceTracker.AddResource(writer);
64+
var stream = pInMsg.BodyPart.GetOriginalDataStream();
65+
StreamReader reader = new StreamReader(stream, true);
66+
var ms = JSONModifier.ConvertToJArray(new Newtonsoft.Json.JsonTextReader(reader));
67+
pInMsg.BodyPart.Data = ms;
68+
pContext.ResourceTracker.AddResource(ms);
10369
}
10470
return pInMsg;
10571
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<packages>
33
<package id="BizTalkComponents.Utils" version="2.4.0" targetFramework="net45" developmentDependency="true" />
4+
<package id="Newtonsoft.Json" version="10.0.3" targetFramework="net46" />
45
</packages>

0 commit comments

Comments
 (0)