Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 9d965e68ae | |||
| 94b76a1001 | |||
| 8ff9e89aff | |||
| 0332af453a | |||
| f650d8b1ed | |||
| e3b086e4a4 | |||
| 43f19ac206 | |||
| 3fdcad0f8a | |||
| dc737187ee | |||
| ff32ad9d1f | |||
| a4153ded57 | |||
| e4a9cb1995 |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -29,3 +29,5 @@ _ReSharper*/
|
||||
*.nupkg
|
||||
/.vs/*
|
||||
/packages/*
|
||||
|
||||
/.issues/
|
||||
|
||||
13
.idea/.idea.VAR.Json/.idea/.gitignore
generated
vendored
Normal file
13
.idea/.idea.VAR.Json/.idea/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
# Rider ignored files
|
||||
/contentModel.xml
|
||||
/.idea.VAR.Json.iml
|
||||
/modules.xml
|
||||
/projectSettingsUpdater.xml
|
||||
# Editor-based HTTP Client requests
|
||||
/httpRequests/
|
||||
# Datasource local storage ignored files
|
||||
/dataSources/
|
||||
/dataSources.local.xml
|
||||
4
.idea/.idea.VAR.Json/.idea/encodings.xml
generated
Normal file
4
.idea/.idea.VAR.Json/.idea/encodings.xml
generated
Normal file
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Encoding" addBOMForNewFiles="with BOM under Windows, with no BOM otherwise" />
|
||||
</project>
|
||||
8
.idea/.idea.VAR.Json/.idea/indexLayout.xml
generated
Normal file
8
.idea/.idea.VAR.Json/.idea/indexLayout.xml
generated
Normal file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="UserContentModel">
|
||||
<attachedFolders />
|
||||
<explicitIncludes />
|
||||
<explicitExcludes />
|
||||
</component>
|
||||
</project>
|
||||
6
.idea/.idea.VAR.Json/.idea/vcs.xml
generated
Normal file
6
.idea/.idea.VAR.Json/.idea/vcs.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
@@ -1,6 +1,6 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2016-2020 Valeriano Alfonso Rodriguez
|
||||
Copyright (c) 2016-2025 Valeriano Alfonso Rodriguez
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
||||
65
README.md
65
README.md
@@ -3,27 +3,51 @@
|
||||
## Usage
|
||||
|
||||
### VAR.Json
|
||||
|
||||
Add the resulting assembly as reference in your projects, and this line on code:
|
||||
|
||||
using VAR.Json;
|
||||
```csharp
|
||||
using VAR.Json;
|
||||
```
|
||||
|
||||
Parse any string with JSON content:
|
||||
|
||||
var jsonParser = new JsonParser();
|
||||
object result = jsonParser("{\"Test\": 1}");
|
||||
```csharp
|
||||
object result = JsonParser.ParseText("{\"Test\": 1}");
|
||||
```
|
||||
|
||||
Serialize any object to JSON:
|
||||
|
||||
var jsonWriter = new JsonWriter();
|
||||
string jsonText = jsonWriter(new List<int>{1, 2, 3, 4});
|
||||
```csharp
|
||||
string jsonText = JsonWriter.WriteObject(new List<int>{1, 2, 3, 4});
|
||||
```
|
||||
|
||||
### VAR.Json.JsonParser
|
||||
|
||||
This object can be invoked with a list of types used to cast the json objects.
|
||||
|
||||
```csharp
|
||||
|
||||
class Person
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public string Surname { get; set; }
|
||||
public DateTime DateOfBirth { get; set; }
|
||||
}
|
||||
|
||||
JsonParser jsonParser = new JsonParser();
|
||||
jsonParser.KnownTypes.Add(typeof(Person));
|
||||
Person jsonText = jsonParser.Parse("{ \"Name\": \"John", \"Surname\": \"Doe\", \"DateOfBirth\": \"1970-01-01\"}") as Person;
|
||||
```
|
||||
|
||||
## Building
|
||||
A Visual Studio 2015 solutions are provided. Simply, click build on the IDE.
|
||||
|
||||
A .nuget package can be build using:
|
||||
VAR.Json\Build.NuGet.cmd
|
||||
A Visual Studio solution is provided. Simply, click build on the IDE.
|
||||
|
||||
The build generates a DLL and a Nuget package.
|
||||
|
||||
## Contributing
|
||||
|
||||
1. Fork it!
|
||||
2. Create your feature branch: `git checkout -b my-new-feature`
|
||||
3. Commit your changes: `git commit -am 'Add some feature'`
|
||||
@@ -31,28 +55,5 @@ A .nuget package can be build using:
|
||||
5. Submit a pull request :D
|
||||
|
||||
## Credits
|
||||
|
||||
* Valeriano Alfonso Rodriguez.
|
||||
|
||||
## License
|
||||
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2016-2017 Valeriano Alfonso Rodriguez
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
@@ -1,397 +1,409 @@
|
||||
using System.Collections.Generic;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
using Xunit;
|
||||
|
||||
namespace VAR.Json.Tests
|
||||
namespace VAR.Json.Tests;
|
||||
|
||||
public class JsonParser_Tests
|
||||
{
|
||||
[TestClass()]
|
||||
public class JsonParser_Tests
|
||||
{
|
||||
#region Parse
|
||||
|
||||
public class SwallowObject
|
||||
private class SwallowObject
|
||||
{
|
||||
public string Text { get; set; }
|
||||
public string? Text { get; set; }
|
||||
public int Number { get; set; }
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__SwallowObject()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
JsonParser parser = new();
|
||||
parser.KnownTypes.Add(typeof(SwallowObject));
|
||||
SwallowObject result = parser.Parse(@"{""Text"": ""AAAA"", ""Number"": 42}") as SwallowObject;
|
||||
Assert.AreEqual(false, parser.Tainted);
|
||||
Assert.AreEqual("AAAA", result.Text);
|
||||
Assert.AreEqual(42, result.Number);
|
||||
SwallowObject? result = parser.Parse(@"{""Text"": ""AAAA"", ""Number"": 42}") as SwallowObject;
|
||||
Assert.False(parser.Tainted);
|
||||
Assert.Equal("AAAA", result?.Text);
|
||||
Assert.Equal(42, result?.Number);
|
||||
}
|
||||
|
||||
public class DeeperObject_L1
|
||||
private class DeeperObject_L1
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public SwallowObject Object { get; set; }
|
||||
public string? Name { get; set; }
|
||||
public SwallowObject? Object { get; set; }
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__DeeperObject_L1()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
JsonParser parser = new();
|
||||
parser.KnownTypes.Add(typeof(SwallowObject));
|
||||
parser.KnownTypes.Add(typeof(DeeperObject_L1));
|
||||
DeeperObject_L1 result = parser.Parse(@"{""Name"": ""Thing"", ""Object"": {""Text"": ""AAAA"", ""Number"": 42}}") as DeeperObject_L1;
|
||||
Assert.AreEqual(false, parser.Tainted);
|
||||
Assert.AreEqual("Thing", result.Name);
|
||||
Assert.AreEqual("AAAA", result.Object.Text);
|
||||
Assert.AreEqual(42, result.Object.Number);
|
||||
DeeperObject_L1? result =
|
||||
parser.Parse(@"{""Name"": ""Thing"", ""Object"": {""Text"": ""AAAA"", ""Number"": 42}}") as
|
||||
DeeperObject_L1;
|
||||
Assert.False(parser.Tainted);
|
||||
Assert.Equal("Thing", result?.Name);
|
||||
Assert.Equal("AAAA", result?.Object?.Text);
|
||||
Assert.Equal(42, result?.Object?.Number);
|
||||
}
|
||||
|
||||
public class DeeperObject_L2
|
||||
private class DeeperObject_L2
|
||||
{
|
||||
public int Count { get; set; }
|
||||
public DeeperObject_L1 Object { get; set; }
|
||||
public DeeperObject_L1? Object { get; set; }
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__DeeperObject_L2()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
JsonParser parser = new();
|
||||
parser.KnownTypes.Add(typeof(SwallowObject));
|
||||
parser.KnownTypes.Add(typeof(DeeperObject_L1));
|
||||
parser.KnownTypes.Add(typeof(DeeperObject_L2));
|
||||
DeeperObject_L2 result = parser.Parse(@"{""Count"": 1, ""Object"": {""Name"": ""Thing"", ""Object"": {""Text"": ""AAAA"", ""Number"": 42}}}") as DeeperObject_L2;
|
||||
Assert.AreEqual(false, parser.Tainted);
|
||||
Assert.AreEqual(1, result.Count);
|
||||
Assert.AreEqual("Thing", result.Object.Name);
|
||||
Assert.AreEqual("AAAA", result.Object.Object.Text);
|
||||
Assert.AreEqual(42, result.Object.Object.Number);
|
||||
DeeperObject_L2? result =
|
||||
parser.Parse(
|
||||
@"{""Count"": 1, ""Object"": {""Name"": ""Thing"", ""Object"": {""Text"": ""AAAA"", ""Number"": 42}}}")
|
||||
as DeeperObject_L2;
|
||||
Assert.False(parser.Tainted);
|
||||
Assert.NotNull(result);
|
||||
Assert.Equal(1, result?.Count);
|
||||
Assert.Equal("Thing", result?.Object?.Name);
|
||||
Assert.Equal("AAAA", result?.Object?.Object?.Text);
|
||||
Assert.Equal(42, result?.Object?.Object?.Number);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__SwallowObjectArray()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
JsonParser parser = new();
|
||||
parser.KnownTypes.Add(typeof(SwallowObject));
|
||||
List<SwallowObject> result = parser.Parse(@"[{""Text"": ""AAAA"", ""Number"": 42}]") as List<SwallowObject>;
|
||||
Assert.AreEqual(false, parser.Tainted);
|
||||
Assert.AreEqual(1, result.Count);
|
||||
Assert.AreEqual("AAAA", result[0].Text);
|
||||
Assert.AreEqual(42, result[0].Number);
|
||||
List<SwallowObject>? result = parser.Parse(@"[{""Text"": ""AAAA"", ""Number"": 42}]") as List<SwallowObject>;
|
||||
Assert.False(parser.Tainted);
|
||||
Assert.NotNull(result);
|
||||
Assert.Single(result);
|
||||
Assert.Equal("AAAA", result?[0].Text);
|
||||
Assert.Equal(42, result?[0].Number);
|
||||
}
|
||||
|
||||
public class DeeperObjectArray_L1
|
||||
private class DeeperObjectArray_L1
|
||||
{
|
||||
public int Count { get; set; }
|
||||
public List<SwallowObject> Array { get; set; }
|
||||
public List<SwallowObject>? Array { get; set; }
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__DeeperObjectArray_L1()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
JsonParser parser = new();
|
||||
parser.KnownTypes.Add(typeof(SwallowObject));
|
||||
parser.KnownTypes.Add(typeof(DeeperObjectArray_L1));
|
||||
DeeperObjectArray_L1 result = parser.Parse(@"{""Count"": 1, ""Array"": [{""Text"": ""AAAA"", ""Number"": 42}]}") as DeeperObjectArray_L1;
|
||||
Assert.AreEqual(false, parser.Tainted);
|
||||
Assert.AreEqual(1, result.Count);
|
||||
Assert.AreEqual("AAAA", result.Array[0].Text);
|
||||
Assert.AreEqual(42, result.Array[0].Number);
|
||||
DeeperObjectArray_L1? result =
|
||||
parser.Parse(@"{""Count"": 1, ""Array"": [{""Text"": ""AAAA"", ""Number"": 42}]}") as
|
||||
DeeperObjectArray_L1;
|
||||
Assert.False(parser.Tainted);
|
||||
Assert.NotNull(result);
|
||||
Assert.Equal(1, result?.Count);
|
||||
Assert.Equal("AAAA", result?.Array?[0].Text);
|
||||
Assert.Equal(42, result?.Array?[0].Number);
|
||||
}
|
||||
|
||||
public class DeeperObjectArray_L2
|
||||
private class DeeperObjectArray_L2
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public List<DeeperObjectArray_L1> Objects { get; set; }
|
||||
public string Name { get; set; } = string.Empty;
|
||||
public List<DeeperObjectArray_L1> Objects { get; set; } = [];
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__DeeperObjectArray_L2()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
JsonParser parser = new();
|
||||
parser.KnownTypes.Add(typeof(SwallowObject));
|
||||
parser.KnownTypes.Add(typeof(DeeperObjectArray_L1));
|
||||
parser.KnownTypes.Add(typeof(DeeperObjectArray_L2));
|
||||
DeeperObjectArray_L2 result = parser.Parse(@"{""Name"": ""Thing"", ""Objects"": [{""Count"": 1, ""Array"": [{""Text"": ""AAAA"", ""Number"": 42}]}]}") as DeeperObjectArray_L2;
|
||||
Assert.AreEqual(false, parser.Tainted);
|
||||
Assert.AreEqual("Thing", result.Name);
|
||||
Assert.AreEqual(1, result.Objects[0].Count);
|
||||
Assert.AreEqual("AAAA", result.Objects[0].Array[0].Text);
|
||||
Assert.AreEqual(42, result.Objects[0].Array[0].Number);
|
||||
DeeperObjectArray_L2? result =
|
||||
parser.Parse(
|
||||
@"{""Name"": ""Thing"", ""Objects"": [{""Count"": 1, ""Array"": [{""Text"": ""AAAA"", ""Number"": 42}]}]}")
|
||||
as DeeperObjectArray_L2;
|
||||
Assert.False(parser.Tainted);
|
||||
Assert.Equal("Thing", result?.Name);
|
||||
Assert.Equal(1, result?.Objects[0].Count);
|
||||
Assert.Equal("AAAA", result?.Objects[0].Array?[0].Text);
|
||||
Assert.Equal(42, result?.Objects[0].Array?[0].Number);
|
||||
}
|
||||
|
||||
#endregion Parse
|
||||
|
||||
#region Validity tests
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__Validity_Fail01()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
object result = parser.Parse(@"""A JSON payload should be an object or array, not a string.""");
|
||||
Assert.AreEqual(true, parser.Tainted);
|
||||
JsonParser parser = new();
|
||||
parser.Parse(@"""A JSON payload should be an object or array, not a string.""");
|
||||
Assert.True(parser.Tainted);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__Validity_Fail02()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
object result = parser.Parse(@"[""Unclosed array""");
|
||||
Assert.AreEqual(true, parser.Tainted);
|
||||
JsonParser parser = new();
|
||||
parser.Parse(@"[""Unclosed array""");
|
||||
Assert.True(parser.Tainted);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__Validity_Fail03()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
object result = parser.Parse(@"{unquoted_key: ""keys must be quoted""}");
|
||||
Assert.AreEqual(true, parser.Tainted);
|
||||
JsonParser parser = new();
|
||||
parser.Parse(@"{unquoted_key: ""keys must be quoted""}");
|
||||
Assert.True(parser.Tainted);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__Validity_Fail04()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
object result = parser.Parse(@"[""extra comma"",]");
|
||||
Assert.AreEqual(true, parser.Tainted);
|
||||
JsonParser parser = new();
|
||||
parser.Parse(@"[""extra comma"",]");
|
||||
Assert.True(parser.Tainted);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__Validity_Fail05()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
object result = parser.Parse(@"[""double extra comma"",,]");
|
||||
Assert.AreEqual(true, parser.Tainted);
|
||||
JsonParser parser = new();
|
||||
parser.Parse(@"[""double extra comma"",,]");
|
||||
Assert.True(parser.Tainted);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__Validity_Fail06()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
object result = parser.Parse(@"[ , ""<-- missing value""]");
|
||||
Assert.AreEqual(true, parser.Tainted);
|
||||
JsonParser parser = new();
|
||||
parser.Parse(@"[ , ""<-- missing value""]");
|
||||
Assert.True(parser.Tainted);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__Validity_Fail07()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
object result = parser.Parse(@"[""Comma after the close""],");
|
||||
Assert.AreEqual(true, parser.Tainted);
|
||||
JsonParser parser = new();
|
||||
parser.Parse(@"[""Comma after the close""],");
|
||||
Assert.True(parser.Tainted);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__Validity_Fail08()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
object result = parser.Parse(@"[""Extra close""]]");
|
||||
Assert.AreEqual(true, parser.Tainted);
|
||||
JsonParser parser = new();
|
||||
parser.Parse(@"[""Extra close""]]");
|
||||
Assert.True(parser.Tainted);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__Validity_Fail09()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
object result = parser.Parse(@"{""Extra comma"": true,}");
|
||||
Assert.AreEqual(true, parser.Tainted);
|
||||
JsonParser parser = new();
|
||||
parser.Parse(@"{""Extra comma"": true,}");
|
||||
Assert.True(parser.Tainted);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__Validity_Fail10()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
object result = parser.Parse(@"{""Extra value after close"": true} ""misplaced quoted value""");
|
||||
Assert.AreEqual(true, parser.Tainted);
|
||||
JsonParser parser = new();
|
||||
parser.Parse(@"{""Extra value after close"": true} ""misplaced quoted value""");
|
||||
Assert.True(parser.Tainted);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__Validity_Fail11()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
object result = parser.Parse(@"{""Illegal expression"": 1 + 2}");
|
||||
Assert.AreEqual(true, parser.Tainted);
|
||||
JsonParser parser = new();
|
||||
parser.Parse(@"{""Illegal expression"": 1 + 2}");
|
||||
Assert.True(parser.Tainted);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__Validity_Fail12()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
object result = parser.Parse(@"{""Illegal invocation"": alert()}");
|
||||
Assert.AreEqual(true, parser.Tainted);
|
||||
JsonParser parser = new();
|
||||
parser.Parse(@"{""Illegal invocation"": alert()}");
|
||||
Assert.True(parser.Tainted);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__Validity_Fail13()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
object result = parser.Parse(@"{""Numbers cannot have leading zeroes"": 013}");
|
||||
Assert.AreEqual(true, parser.Tainted);
|
||||
JsonParser parser = new();
|
||||
parser.Parse(@"{""Numbers cannot have leading zeroes"": 013}");
|
||||
Assert.True(parser.Tainted);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__Validity_Fail14()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
object result = parser.Parse(@"{""Numbers cannot be hex"": 0x14}");
|
||||
Assert.AreEqual(true, parser.Tainted);
|
||||
JsonParser parser = new();
|
||||
parser.Parse(@"{""Numbers cannot be hex"": 0x14}");
|
||||
Assert.True(parser.Tainted);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__Validity_Fail15()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
object result = parser.Parse(@"[""Illegal backslash escape: \x15""]");
|
||||
Assert.AreEqual(true, parser.Tainted);
|
||||
JsonParser parser = new();
|
||||
parser.Parse(@"[""Illegal backslash escape: \x15""]");
|
||||
Assert.True(parser.Tainted);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__Validity_Fail16()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
object result = parser.Parse(@"[\naked]");
|
||||
Assert.AreEqual(true, parser.Tainted);
|
||||
JsonParser parser = new();
|
||||
parser.Parse(@"[\naked]");
|
||||
Assert.True(parser.Tainted);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__Validity_Fail17()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
object result = parser.Parse(@"[""Illegal backslash escape: \017""]");
|
||||
Assert.AreEqual(true, parser.Tainted);
|
||||
JsonParser parser = new();
|
||||
parser.Parse(@"[""Illegal backslash escape: \017""]");
|
||||
Assert.True(parser.Tainted);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__Validity_Fail18()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
object result = parser.Parse(@"[[[[[[[[[[[[[[[[[[[[""Too deep""]]]]]]]]]]]]]]]]]]]]");
|
||||
Assert.AreEqual(true, parser.Tainted);
|
||||
JsonParser parser = new();
|
||||
parser.Parse(@"[[[[[[[[[[[[[[[[[[[[""Too deep""]]]]]]]]]]]]]]]]]]]]");
|
||||
Assert.True(parser.Tainted);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__Validity_Fail19()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
object result = parser.Parse(@"{""Missing colon"" null}");
|
||||
Assert.AreEqual(true, parser.Tainted);
|
||||
JsonParser parser = new();
|
||||
parser.Parse(@"{""Missing colon"" null}");
|
||||
Assert.True(parser.Tainted);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__Validity_Fail20()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
object result = parser.Parse(@"{""Double colon"":: null}");
|
||||
Assert.AreEqual(true, parser.Tainted);
|
||||
JsonParser parser = new();
|
||||
parser.Parse(@"{""Double colon"":: null}");
|
||||
Assert.True(parser.Tainted);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__Validity_Fail21()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
object result = parser.Parse(@"{""Comma instead of colon"", null}");
|
||||
Assert.AreEqual(true, parser.Tainted);
|
||||
JsonParser parser = new();
|
||||
parser.Parse(@"{""Comma instead of colon"", null}");
|
||||
Assert.True(parser.Tainted);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__Validity_Fail22()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
object result = parser.Parse(@"[""Colon instead of comma"": false]");
|
||||
Assert.AreEqual(true, parser.Tainted);
|
||||
JsonParser parser = new();
|
||||
parser.Parse(@"[""Colon instead of comma"": false]");
|
||||
Assert.True(parser.Tainted);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__Validity_Fail23()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
object result = parser.Parse(@"[""Bad value"", truth]");
|
||||
Assert.AreEqual(true, parser.Tainted);
|
||||
JsonParser parser = new();
|
||||
parser.Parse(@"[""Bad value"", truth]");
|
||||
Assert.True(parser.Tainted);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__Validity_Fail24()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
object result = parser.Parse(@"['single quote']");
|
||||
Assert.AreEqual(true, parser.Tainted);
|
||||
JsonParser parser = new();
|
||||
parser.Parse(@"['single quote']");
|
||||
Assert.True(parser.Tainted);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__Validity_Fail25()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
object result = parser.Parse(@"["" tab character in string ""]");
|
||||
Assert.AreEqual(true, parser.Tainted);
|
||||
JsonParser parser = new();
|
||||
parser.Parse(@"["" tab character in string ""]");
|
||||
Assert.True(parser.Tainted);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__Validity_Fail26()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
object result = parser.Parse(@"[""tab\ character\ in\ string\ ""]");
|
||||
Assert.AreEqual(true, parser.Tainted);
|
||||
JsonParser parser = new();
|
||||
parser.Parse(@"[""tab\ character\ in\ string\ ""]");
|
||||
Assert.True(parser.Tainted);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__Validity_Fail27()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
object result = parser.Parse(@"[""line
|
||||
JsonParser parser = new();
|
||||
parser.Parse(@"[""line
|
||||
break""]");
|
||||
Assert.AreEqual(true, parser.Tainted);
|
||||
Assert.True(parser.Tainted);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__Validity_Fail28()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
object result = parser.Parse(@"[""line\
|
||||
JsonParser parser = new();
|
||||
parser.Parse(@"[""line\
|
||||
break""]");
|
||||
Assert.AreEqual(true, parser.Tainted);
|
||||
Assert.True(parser.Tainted);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__Validity_Fail29()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
object result = parser.Parse(@"[0e]");
|
||||
Assert.AreEqual(true, parser.Tainted);
|
||||
JsonParser parser = new();
|
||||
parser.Parse(@"[0e]");
|
||||
Assert.True(parser.Tainted);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__Validity_Fail30()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
object result = parser.Parse(@"[0e+]");
|
||||
Assert.AreEqual(true, parser.Tainted);
|
||||
JsonParser parser = new();
|
||||
parser.Parse(@"[0e+]");
|
||||
Assert.True(parser.Tainted);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__Validity_Fail31()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
object result = parser.Parse(@"[0e+-1]");
|
||||
Assert.AreEqual(true, parser.Tainted);
|
||||
JsonParser parser = new();
|
||||
parser.Parse(@"[0e+-1]");
|
||||
Assert.True(parser.Tainted);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__Validity_Fail32()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
object result = parser.Parse(@"{""Comma instead if closing brace"": true,");
|
||||
Assert.AreEqual(true, parser.Tainted);
|
||||
JsonParser parser = new();
|
||||
parser.Parse(@"{""Comma instead if closing brace"": true,");
|
||||
Assert.True(parser.Tainted);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__Validity_Fail33()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
object result = parser.Parse(@"[""mismatch""}");
|
||||
Assert.AreEqual(true, parser.Tainted);
|
||||
JsonParser parser = new();
|
||||
parser.Parse(@"[""mismatch""}");
|
||||
Assert.True(parser.Tainted);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__Validity_Pass01()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
object result = parser.Parse(@"[
|
||||
JsonParser parser = new();
|
||||
parser.Parse(@"[
|
||||
""JSON Test Pattern pass1"",
|
||||
{""object with 1 member"":[""array with 1 element""]},
|
||||
{},
|
||||
@@ -449,31 +461,30 @@ break""]");
|
||||
1e-1,
|
||||
1e00,2e+00,2e-00
|
||||
,""rosebud""]");
|
||||
Assert.AreEqual(false, parser.Tainted);
|
||||
Assert.False(parser.Tainted);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__Validity_Pass02()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
object result = parser.Parse(@"[[[[[[[[[[[[[[[[[[[""Not too deep""]]]]]]]]]]]]]]]]]]]");
|
||||
Assert.AreEqual(false, parser.Tainted);
|
||||
JsonParser parser = new();
|
||||
parser.Parse(@"[[[[[[[[[[[[[[[[[[[""Not too deep""]]]]]]]]]]]]]]]]]]]");
|
||||
Assert.False(parser.Tainted);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
[Fact]
|
||||
public void Parse__Validity_Pass03()
|
||||
{
|
||||
JsonParser parser = new JsonParser();
|
||||
object result = parser.Parse(@"{
|
||||
JsonParser parser = new();
|
||||
parser.Parse(@"{
|
||||
""JSON Test Pattern pass3"": {
|
||||
""The outermost value"": ""must be an object or array."",
|
||||
""In this test"": ""It is an object.""
|
||||
}
|
||||
}
|
||||
");
|
||||
Assert.AreEqual(false, parser.Tainted);
|
||||
Assert.False(parser.Tainted);
|
||||
}
|
||||
|
||||
#endregion Validity tests
|
||||
}
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("VAR.Json.Tests")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("VAR.Json.Tests")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2020")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Setting ComVisible to false makes the types in this assembly not visible
|
||||
// to COM components. If you need to access a type in this assembly from
|
||||
// COM, set the ComVisible attribute to true on that type.
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
[assembly: Guid("b92ac920-87d7-46de-afd8-d9c5eff7debe")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||
@@ -1,106 +1,28 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="..\packages\MSTest.TestAdapter.2.1.1\build\net45\MSTest.TestAdapter.props" Condition="Exists('..\packages\MSTest.TestAdapter.2.1.1\build\net45\MSTest.TestAdapter.props')" />
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{B92AC920-87D7-46DE-AFD8-D9C5EFF7DEBE}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>VAR.Json.Tests</RootNamespace>
|
||||
<AssemblyName>VAR.Json.Tests</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
||||
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
|
||||
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
||||
<ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages</ReferencePath>
|
||||
<IsCodedUITest>False</IsCodedUITest>
|
||||
<TestProjectType>UnitTest</TestProjectType>
|
||||
<TargetFrameworkProfile />
|
||||
<NuGetPackageImportStamp>
|
||||
</NuGetPackageImportStamp>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<TargetFramework>net9.0</TargetFramework>
|
||||
|
||||
<IsPackable>false</IsPackable>
|
||||
<Nullable>enable</Nullable>
|
||||
<LangVersion>default</LangVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Reference Include="Microsoft.VisualStudio.TestPlatform.TestFramework, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\MSTest.TestFramework.2.1.1\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\MSTest.TestFramework.2.1.1\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.10.0"/>
|
||||
<PackageReference Include="xunit" Version="2.4.1"/>
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="coverlet.collector" Version="3.0.3">
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
</PackageReference>
|
||||
</ItemGroup>
|
||||
<Choose>
|
||||
<When Condition="('$(VisualStudioVersion)' == '10.0' or '$(VisualStudioVersion)' == '') and '$(TargetFrameworkVersion)' == 'v3.5'">
|
||||
|
||||
<ItemGroup>
|
||||
<Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
|
||||
<ProjectReference Include="..\VAR.Json\VAR.Json.csproj"/>
|
||||
</ItemGroup>
|
||||
</When>
|
||||
<Otherwise />
|
||||
</Choose>
|
||||
<ItemGroup>
|
||||
<Compile Include="JsonParser_Tests.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="packages.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\VAR.Json\VAR.Json.csproj">
|
||||
<Project>{28B3F937-145C-4FD4-A75B-A25EA4CC0428}</Project>
|
||||
<Name>VAR.Json</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<Choose>
|
||||
<When Condition="'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'">
|
||||
<ItemGroup>
|
||||
<Reference Include="Microsoft.VisualStudio.QualityTools.CodedUITestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.VisualStudio.TestTools.UITest.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.VisualStudio.TestTools.UITest.Extension, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.VisualStudio.TestTools.UITesting, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
</When>
|
||||
</Choose>
|
||||
<Import Project="$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets" Condition="Exists('$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets')" />
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||
<PropertyGroup>
|
||||
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
|
||||
</PropertyGroup>
|
||||
<Error Condition="!Exists('..\packages\MSTest.TestAdapter.2.1.1\build\net45\MSTest.TestAdapter.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MSTest.TestAdapter.2.1.1\build\net45\MSTest.TestAdapter.props'))" />
|
||||
<Error Condition="!Exists('..\packages\MSTest.TestAdapter.2.1.1\build\net45\MSTest.TestAdapter.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MSTest.TestAdapter.2.1.1\build\net45\MSTest.TestAdapter.targets'))" />
|
||||
</Target>
|
||||
<Import Project="..\packages\MSTest.TestAdapter.2.1.1\build\net45\MSTest.TestAdapter.targets" Condition="Exists('..\packages\MSTest.TestAdapter.2.1.1\build\net45\MSTest.TestAdapter.targets')" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
|
||||
</Project>
|
||||
@@ -1,5 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="MSTest.TestAdapter" version="2.1.1" targetFramework="net461" />
|
||||
<package id="MSTest.TestFramework" version="2.1.1" targetFramework="net461" />
|
||||
</packages>
|
||||
20
VAR.Json.sln
20
VAR.Json.sln
@@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 16
|
||||
VisualStudioVersion = 16.0.30330.147
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VAR.Json", "VAR.Json\VAR.Json.csproj", "{28B3F937-145C-4FD4-A75B-A25EA4CC0428}"
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VAR.Json", "VAR.Json\VAR.Json.csproj", "{28B3F937-145C-4FD4-A75B-A25EA4CC0428}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Notes", "Notes", "{4C23A421-5348-48F1-8B67-A4D43E616FDE}"
|
||||
ProjectSection(SolutionItems) = preProject
|
||||
@@ -11,7 +11,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Notes", "Notes", "{4C23A421
|
||||
README.md = README.md
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VAR.Json.Tests", "VAR.Json.Tests\VAR.Json.Tests.csproj", "{B92AC920-87D7-46DE-AFD8-D9C5EFF7DEBE}"
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VAR.Json.Tests", "VAR.Json.Tests\VAR.Json.Tests.csproj", "{0E955F4D-49A9-40BC-94F7-7E2EDB30713B}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
@@ -19,14 +19,14 @@ Global
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{28B3F937-145C-4FD4-A75B-A25EA4CC0428}.Debug|Any CPU.ActiveCfg = Debug .Net 4.6.1|Any CPU
|
||||
{28B3F937-145C-4FD4-A75B-A25EA4CC0428}.Debug|Any CPU.Build.0 = Debug .Net 4.6.1|Any CPU
|
||||
{28B3F937-145C-4FD4-A75B-A25EA4CC0428}.Release|Any CPU.ActiveCfg = Release .Net 4.6.1|Any CPU
|
||||
{28B3F937-145C-4FD4-A75B-A25EA4CC0428}.Release|Any CPU.Build.0 = Release .Net 4.6.1|Any CPU
|
||||
{B92AC920-87D7-46DE-AFD8-D9C5EFF7DEBE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{B92AC920-87D7-46DE-AFD8-D9C5EFF7DEBE}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{B92AC920-87D7-46DE-AFD8-D9C5EFF7DEBE}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{B92AC920-87D7-46DE-AFD8-D9C5EFF7DEBE}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{28B3F937-145C-4FD4-A75B-A25EA4CC0428}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{28B3F937-145C-4FD4-A75B-A25EA4CC0428}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{28B3F937-145C-4FD4-A75B-A25EA4CC0428}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{28B3F937-145C-4FD4-A75B-A25EA4CC0428}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{0E955F4D-49A9-40BC-94F7-7E2EDB30713B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{0E955F4D-49A9-40BC-94F7-7E2EDB30713B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{0E955F4D-49A9-40BC-94F7-7E2EDB30713B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{0E955F4D-49A9-40BC-94F7-7E2EDB30713B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
||||
76
VAR.Json.sln.DotSettings
Normal file
76
VAR.Json.sln.DotSettings
Normal file
@@ -0,0 +1,76 @@
|
||||
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
||||
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpCodeStyle/BRACES_FOR_IFELSE/@EntryValue">NotRequired</s:String>
|
||||
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpCodeStyle/TRAILING_COMMA_IN_MULTILINE_LISTS/@EntryValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpCodeStyle/TRAILING_COMMA_IN_SINGLELINE_LISTS/@EntryValue">True</s:Boolean>
|
||||
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/EMPTY_BLOCK_STYLE/@EntryValue">TOGETHER_SAME_LINE</s:String>
|
||||
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/KEEP_EXISTING_EMBEDDED_BLOCK_ARRANGEMENT/@EntryValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/PLACE_SIMPLE_EMBEDDED_BLOCK_ON_SAME_LINE/@EntryValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/SPACE_AFTER_TYPECAST_PARENTHESES/@EntryValue">False</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/SPACE_WITHIN_SINGLE_LINE_ARRAY_INITIALIZER_BRACES/@EntryValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/HtmlFormatter/ALLOW_FAR_ALIGNMENT/@EntryValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/HtmlFormatter/NormalizeTagNames/@EntryValue">True</s:Boolean>
|
||||
<s:String x:Key="/Default/CodeStyle/CodeFormatting/HtmlFormatter/ProcessingInstructionAttributeIndenting/@EntryValue">OneStep</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/CodeFormatting/HtmlFormatter/TagAttributeIndenting/@EntryValue">OneStep</s:String>
|
||||
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/HtmlFormatter/TagSpaceBeforeHeaderEnd1/@EntryValue">True</s:Boolean>
|
||||
<s:String x:Key="/Default/CodeStyle/CSharpVarKeywordUsage/ForBuiltInTypes/@EntryValue">UseVarWhenEvident</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/CSharpVarKeywordUsage/ForOtherTypes/@EntryValue">UseVarWhenEvident</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=AES/@EntryIndexedValue">AES</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=AM/@EntryIndexedValue">AM</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=AUX/@EntryIndexedValue">AUX</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=CYC/@EntryIndexedValue">CYC</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=DC/@EntryIndexedValue">DC</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=DES/@EntryIndexedValue">DES</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=EPM/@EntryIndexedValue">EPM</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=GDI/@EntryIndexedValue">GDI</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=ID/@EntryIndexedValue">ID</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=IP/@EntryIndexedValue">IP</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=RECT/@EntryIndexedValue">RECT</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=RGB/@EntryIndexedValue">RGB</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SCART/@EntryIndexedValue">SCART</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SPDIF/@EntryIndexedValue">SPDIF</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SQL/@EntryIndexedValue">SQL</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SRCCOPY/@EntryIndexedValue">SRCCOPY</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=TCP/@EntryIndexedValue">TCP</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=URL/@EntryIndexedValue">URL</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=USB/@EntryIndexedValue">USB</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=VAR/@EntryIndexedValue">VAR</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=WMIC/@EntryIndexedValue">WMIC</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=YRYBY/@EntryIndexedValue">YRYBY</s:String>
|
||||
<s:Boolean x:Key="/Default/CodeStyle/Naming/CSharpNaming/ApplyAutoDetectedRules/@EntryValue">False</s:Boolean>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=Constants/@EntryIndexedValue"><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb_AaBb" /></s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=EnumMember/@EntryIndexedValue"><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb_AaBb"><ExtraRule Prefix="T" Suffix="" Style="AaBb_AaBb" /></Policy></s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=Interfaces/@EntryIndexedValue"><Policy Inspect="True" Prefix="I" Suffix="" Style="AaBb_AaBb" /></s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=LocalConstants/@EntryIndexedValue"><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb_AaBb" /></s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=Locals/@EntryIndexedValue"><Policy Inspect="True" Prefix="" Suffix="" Style="aaBb_AaBb" /></s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=Method/@EntryIndexedValue"><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb_AaBb" /></s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=Parameters/@EntryIndexedValue"><Policy Inspect="True" Prefix="" Suffix="" Style="aaBb_AaBb" /></s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateConstants/@EntryIndexedValue"><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb_AaBb" /></s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateInstanceFields/@EntryIndexedValue"><Policy Inspect="True" Prefix="_" Suffix="" Style="aaBb_AaBb" /></s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateStaticFields/@EntryIndexedValue"><Policy Inspect="True" Prefix="_" Suffix="" Style="aaBb_AaBb" /></s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateStaticReadonly/@EntryIndexedValue"><Policy Inspect="True" Prefix="_" Suffix="" Style="aaBb_AaBb" /></s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=Property/@EntryIndexedValue"><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb_AaBb" /></s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PublicFields/@EntryIndexedValue"><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb_AaBb" /></s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=StaticReadonly/@EntryIndexedValue"><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /></s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=TypesAndNamespaces/@EntryIndexedValue"><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb_AaBb" /></s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=15b5b1f1_002D457c_002D4ca6_002Db278_002D5615aedc07d3/@EntryIndexedValue"><Policy><Descriptor Staticness="Static" AccessRightKinds="Private" Description="Static readonly fields (private)"><ElementKinds><Kind Name="READONLY_FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="_" Suffix="" Style="aaBb_AaBb" /></Policy></s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=236f7aa5_002D7b06_002D43ca_002Dbf2a_002D9b31bfcff09a/@EntryIndexedValue"><Policy><Descriptor Staticness="Any" AccessRightKinds="Private" Description="Constant fields (private)"><ElementKinds><Kind Name="CONSTANT_FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="AaBb_AaBb" /></Policy></s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=4a98fdf6_002D7d98_002D4f5a_002Dafeb_002Dea44ad98c70c/@EntryIndexedValue"><Policy><Descriptor Staticness="Instance" AccessRightKinds="Private" Description="Instance fields (private)"><ElementKinds><Kind Name="FIELD" /><Kind Name="READONLY_FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="_" Suffix="" Style="aaBb_AaBb" /></Policy></s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=53eecf85_002Dd821_002D40e8_002Dac97_002Dfdb734542b84/@EntryIndexedValue"><Policy><Descriptor Staticness="Instance" AccessRightKinds="Protected, ProtectedInternal, Internal, Public, PrivateProtected" Description="Instance fields (not private)"><ElementKinds><Kind Name="FIELD" /><Kind Name="READONLY_FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="AaBb_AaBb" /></Policy></s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=61a991a4_002Dd0a3_002D4d19_002D90a5_002Df8f4d75c30c1/@EntryIndexedValue"><Policy><Descriptor Staticness="Any" AccessRightKinds="Any" Description="Local variables"><ElementKinds><Kind Name="LOCAL_VARIABLE" /></ElementKinds></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="aaBb_AaBb" /></Policy></s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=669e5282_002Dfb4b_002D4e90_002D91e7_002D07d269d04b60/@EntryIndexedValue"><Policy><Descriptor Staticness="Any" AccessRightKinds="Protected, ProtectedInternal, Internal, Public, PrivateProtected" Description="Constant fields (not private)"><ElementKinds><Kind Name="CONSTANT_FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="AaBb_AaBb" /></Policy></s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=70345118_002D4b40_002D4ece_002D937c_002Dbbeb7a0b2e70/@EntryIndexedValue"><Policy><Descriptor Staticness="Static" AccessRightKinds="Protected, ProtectedInternal, Internal, Public, PrivateProtected" Description="Static fields (not private)"><ElementKinds><Kind Name="FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="AaBb_AaBb" /></Policy></s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=8284009d_002De743_002D4d89_002D9402_002Da5bf9a89b657/@EntryIndexedValue"><Policy><Descriptor Staticness="Any" AccessRightKinds="Any" Description="Methods"><ElementKinds><Kind Name="METHOD" /></ElementKinds></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="AaBb_AaBb" /></Policy></s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=8a85b61a_002D1024_002D4f87_002Db9ef_002D1fdae19930a1/@EntryIndexedValue"><Policy><Descriptor Staticness="Any" AccessRightKinds="Any" Description="Parameters"><ElementKinds><Kind Name="PARAMETER" /></ElementKinds></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="aaBb_AaBb" /></Policy></s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=8b8504e3_002Df0be_002D4c14_002D9103_002Dc732f2bddc15/@EntryIndexedValue"><Policy><Descriptor Staticness="Any" AccessRightKinds="Any" Description="Enum members"><ElementKinds><Kind Name="ENUM_MEMBER" /></ElementKinds></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="AaBb_AaBb"><ExtraRule Prefix="T" Suffix="" Style="AaBb_AaBb" /></Policy></Policy></s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=a0b4bc4d_002Dd13b_002D4a37_002Db37e_002Dc9c6864e4302/@EntryIndexedValue"><Policy><Descriptor Staticness="Any" AccessRightKinds="Any" Description="Types and namespaces"><ElementKinds><Kind Name="NAMESPACE" /><Kind Name="CLASS" /><Kind Name="STRUCT" /><Kind Name="ENUM" /><Kind Name="DELEGATE" /></ElementKinds></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="AaBb_AaBb" /></Policy></s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=a4f433b8_002Dabcd_002D4e55_002Da08f_002D82e78cef0f0c/@EntryIndexedValue"><Policy><Descriptor Staticness="Any" AccessRightKinds="Any" Description="Local constants"><ElementKinds><Kind Name="LOCAL_CONSTANT" /></ElementKinds></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="AaBb_AaBb" /></Policy></s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=a7a3339e_002D4e89_002D4319_002D9735_002Da9dc4cb74cc7/@EntryIndexedValue"><Policy><Descriptor Staticness="Any" AccessRightKinds="Any" Description="Interfaces"><ElementKinds><Kind Name="INTERFACE" /></ElementKinds></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="I" Suffix="" Style="AaBb_AaBb" /></Policy></s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=c85a0503_002D4de2_002D40f1_002D9cd6_002Da4054c05d384/@EntryIndexedValue"><Policy><Descriptor Staticness="Any" AccessRightKinds="Any" Description="Properties"><ElementKinds><Kind Name="PROPERTY" /></ElementKinds></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="AaBb_AaBb" /></Policy></s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=c873eafb_002Dd57f_002D481d_002D8c93_002D77f6863c2f88/@EntryIndexedValue"><Policy><Descriptor Staticness="Static" AccessRightKinds="Protected, ProtectedInternal, Internal, Public, PrivateProtected" Description="Static readonly fields (not private)"><ElementKinds><Kind Name="READONLY_FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="AaBb" /></Policy></s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=f9fce829_002De6f4_002D4cb2_002D80f1_002D5497c44f51df/@EntryIndexedValue"><Policy><Descriptor Staticness="Static" AccessRightKinds="Private" Description="Static fields (private)"><ElementKinds><Kind Name="FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="_" Suffix="" Style="aaBb_AaBb" /></Policy></s:String>
|
||||
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpKeepExistingMigration/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpPlaceEmbeddedOnSameLineMigration/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpUseContinuousIndentInsideBracesMigration/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateBlankLinesAroundFieldToBlankLinesAroundProperty/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EPredefinedNamingRulesToUserRulesUpgrade/@EntryIndexedValue">True</s:Boolean>
|
||||
</wpf:ResourceDictionary>
|
||||
@@ -1,24 +0,0 @@
|
||||
@echo off
|
||||
|
||||
:: MSBuild and tools path
|
||||
if exist "%ProgramFiles%\MSBuild\14.0\bin" set PATH=%ProgramFiles%\MSBuild\14.0\bin;%PATH%
|
||||
if exist "%ProgramFiles(x86)%\MSBuild\14.0\bin" set PATH=%ProgramFiles(x86)%\MSBuild\14.0\bin;%PATH%
|
||||
|
||||
:: NuGet
|
||||
set nuget="nuget"
|
||||
if exist "%~dp0..\packages\NuGet.CommandLine.3.4.3\tools\NuGet.exe" set nuget="%~dp0\..\packages\NuGet.CommandLine.3.4.3\tools\NuGet.exe"
|
||||
|
||||
:: Release .Net 3.5
|
||||
Title Building Release .Net 3.5
|
||||
msbuild VAR.Json.csproj /t:Build /p:Configuration="Release .Net 3.5" /p:Platform="AnyCPU"
|
||||
|
||||
:: Release .Net 4.6.1
|
||||
Title Building Release .Net 4.6.1
|
||||
msbuild VAR.Json.csproj /t:Build /p:Configuration="Release .Net 4.6.1" /p:Platform="AnyCPU"
|
||||
|
||||
:: Packing Nuget
|
||||
Title Packing Nuget
|
||||
%nuget% pack VAR.Json.csproj -Verbosity detailed -OutputDir "NuGet" -MSBuildVersion "14.0" -Properties Configuration="Release .Net 4.6.1" -Prop Platform=AnyCPU
|
||||
|
||||
title Finished
|
||||
pause
|
||||
@@ -4,59 +4,51 @@ using System.Globalization;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
|
||||
namespace VAR.Json
|
||||
namespace VAR.Json;
|
||||
|
||||
public class JsonParser
|
||||
{
|
||||
public class JsonParser
|
||||
{
|
||||
#region Declarations
|
||||
|
||||
private const int MaxRecursiveCount = 20;
|
||||
|
||||
private ParserContext _ctx;
|
||||
private bool _tainted = false;
|
||||
private readonly ParserContext _ctx = new();
|
||||
private bool _tainted;
|
||||
|
||||
private readonly List<Type> _knownTypes = new List<Type>();
|
||||
private readonly List<Type> _knownTypes = [];
|
||||
|
||||
#endregion Declarations
|
||||
|
||||
#region Properties
|
||||
|
||||
public bool Tainted
|
||||
{
|
||||
get { return _tainted; }
|
||||
}
|
||||
public bool Tainted => _tainted;
|
||||
|
||||
public List<Type> KnownTypes
|
||||
{
|
||||
get { return _knownTypes; }
|
||||
}
|
||||
public List<Type> KnownTypes => _knownTypes;
|
||||
|
||||
#endregion Properties
|
||||
|
||||
#region Private methods
|
||||
|
||||
private static readonly Dictionary<Type, PropertyInfo[]> _dictProperties = new Dictionary<Type, PropertyInfo[]>();
|
||||
private static readonly Dictionary<Type, PropertyInfo[]> _dictProperties = new();
|
||||
|
||||
private PropertyInfo[] Type_GetProperties(Type type)
|
||||
{
|
||||
PropertyInfo[] typeProperties = null;
|
||||
if (_dictProperties.ContainsKey(type)) { typeProperties = _dictProperties[type]; }
|
||||
else
|
||||
{
|
||||
PropertyInfo[] typeProperties;
|
||||
lock (_dictProperties)
|
||||
{
|
||||
if (_dictProperties.ContainsKey(type)) { typeProperties = _dictProperties[type]; }
|
||||
else
|
||||
{
|
||||
typeProperties = type.GetProperties(BindingFlags.Public | BindingFlags.OptionalParamBinding | BindingFlags.Instance);
|
||||
typeProperties = type.GetProperties(BindingFlags.Public | BindingFlags.OptionalParamBinding |
|
||||
BindingFlags.Instance);
|
||||
_dictProperties.Add(type, typeProperties);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return typeProperties;
|
||||
}
|
||||
|
||||
private float CompareToType(Dictionary<string, object> obj, Type type)
|
||||
private float CompareToType(Dictionary<string, object?> obj, Type type)
|
||||
{
|
||||
PropertyInfo[] typeProperties = Type_GetProperties(type);
|
||||
int count = 0;
|
||||
@@ -67,10 +59,11 @@ namespace VAR.Json
|
||||
count++;
|
||||
}
|
||||
}
|
||||
return ((float)count / (float)typeProperties.Length);
|
||||
|
||||
return count / (float)typeProperties.Length;
|
||||
}
|
||||
|
||||
private object ConvertToType(Dictionary<string, object> obj, Type type)
|
||||
private object ConvertToType(Dictionary<string, object?> obj, Type type)
|
||||
{
|
||||
PropertyInfo[] typeProperties = Type_GetProperties(type);
|
||||
object newObj = ObjectActivator.CreateInstance(type);
|
||||
@@ -78,17 +71,17 @@ namespace VAR.Json
|
||||
{
|
||||
if (obj.ContainsKey(prop.Name))
|
||||
{
|
||||
Type underliningType = Nullable.GetUnderlyingType(prop.PropertyType);
|
||||
Type? underliningType = Nullable.GetUnderlyingType(prop.PropertyType);
|
||||
Type effectiveType = underliningType ?? prop.PropertyType;
|
||||
object valueOrig = obj[prop.Name];
|
||||
object valueDest;
|
||||
object? valueOrig = obj[prop.Name];
|
||||
object? valueDest;
|
||||
if (underliningType != null && valueOrig == null)
|
||||
{
|
||||
valueDest = null;
|
||||
}
|
||||
else if (effectiveType == typeof(Guid) && valueOrig is string)
|
||||
else if (effectiveType == typeof(Guid) && valueOrig is string valGuid)
|
||||
{
|
||||
valueDest = new Guid((string)valueOrig);
|
||||
valueDest = new Guid(valGuid);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -101,15 +94,17 @@ namespace VAR.Json
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
prop.SetValue(newObj, valueDest, null);
|
||||
}
|
||||
}
|
||||
|
||||
return newObj;
|
||||
}
|
||||
|
||||
private object TryConvertToTypes(Dictionary<string, object> obj)
|
||||
private object TryConvertToTypes(Dictionary<string, object?> obj)
|
||||
{
|
||||
Type bestMatch = null;
|
||||
Type? bestMatch = null;
|
||||
float bestMatchFactor = 0.0f;
|
||||
foreach (Type type in _knownTypes)
|
||||
{
|
||||
@@ -120,6 +115,7 @@ namespace VAR.Json
|
||||
bestMatchFactor = matchFactor;
|
||||
}
|
||||
}
|
||||
|
||||
if (bestMatch != null)
|
||||
{
|
||||
try
|
||||
@@ -127,8 +123,12 @@ namespace VAR.Json
|
||||
object newObj = ConvertToType(obj, bestMatch);
|
||||
return newObj;
|
||||
}
|
||||
catch (Exception) { } /* Nom Nom */
|
||||
catch (Exception)
|
||||
{
|
||||
// ignored
|
||||
}
|
||||
}
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
@@ -151,17 +151,19 @@ namespace VAR.Json
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
private string ParseQuotedString()
|
||||
{
|
||||
StringBuilder scratch = new StringBuilder();
|
||||
StringBuilder scratch = new();
|
||||
char c = _ctx.SkipWhite();
|
||||
if (c == '"')
|
||||
{
|
||||
c = _ctx.Next();
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
if (c == '\\')
|
||||
@@ -208,6 +210,7 @@ namespace VAR.Json
|
||||
// StrictRules: Mark as tainted on unknown escaped character
|
||||
_tainted = true;
|
||||
}
|
||||
|
||||
c = _ctx.Next();
|
||||
}
|
||||
else if (c == '"')
|
||||
@@ -217,24 +220,26 @@ namespace VAR.Json
|
||||
}
|
||||
else
|
||||
{
|
||||
// StrictRules: Mark as tainted on ilegal characters
|
||||
// StrictRules: Mark as tainted on illegal characters
|
||||
if (c == '\t' || c == '\n') { _tainted = true; }
|
||||
|
||||
scratch.Append(c);
|
||||
c = _ctx.Next();
|
||||
}
|
||||
} while (!_ctx.AtEnd());
|
||||
|
||||
return scratch.ToString();
|
||||
}
|
||||
|
||||
private string ParseSingleQuotedString()
|
||||
{
|
||||
StringBuilder scratch = new StringBuilder();
|
||||
StringBuilder scratch = new();
|
||||
char c = _ctx.SkipWhite();
|
||||
if (c == '\'')
|
||||
{
|
||||
c = _ctx.Next();
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
if (c == '\\')
|
||||
@@ -281,6 +286,7 @@ namespace VAR.Json
|
||||
// StrictRules: Mark as tainted on unknown escaped character
|
||||
_tainted = true;
|
||||
}
|
||||
|
||||
c = _ctx.Next();
|
||||
}
|
||||
else if (c == '\'')
|
||||
@@ -290,13 +296,14 @@ namespace VAR.Json
|
||||
}
|
||||
else
|
||||
{
|
||||
// StrictRules: Mark as tainted on ilegal characters
|
||||
// StrictRules: Mark as tainted on illegal characters
|
||||
if (c == '\t' || c == '\n') { _tainted = true; }
|
||||
|
||||
scratch.Append(c);
|
||||
c = _ctx.Next();
|
||||
}
|
||||
} while (!_ctx.AtEnd());
|
||||
|
||||
return scratch.ToString();
|
||||
}
|
||||
|
||||
@@ -307,13 +314,16 @@ namespace VAR.Json
|
||||
{
|
||||
return ParseQuotedString();
|
||||
}
|
||||
|
||||
if (c == '\'')
|
||||
{
|
||||
_tainted = true;
|
||||
return ParseSingleQuotedString();
|
||||
}
|
||||
|
||||
if (mustBeQuoted) { _tainted = true; }
|
||||
StringBuilder scratch = new StringBuilder();
|
||||
|
||||
StringBuilder scratch = new();
|
||||
|
||||
while (!_ctx.AtEnd()
|
||||
&& (char.IsLetter(c) || char.IsDigit(c) || c == '_'))
|
||||
@@ -325,15 +335,14 @@ namespace VAR.Json
|
||||
return scratch.ToString();
|
||||
}
|
||||
|
||||
private object ParseNumber()
|
||||
private object? ParseNumber()
|
||||
{
|
||||
StringBuilder scratch = new StringBuilder();
|
||||
StringBuilder scratch = new();
|
||||
bool isFloat = false;
|
||||
bool isExp = false;
|
||||
int numberLenght = 0;
|
||||
int expLenght = 0;
|
||||
char c;
|
||||
c = _ctx.SkipWhite();
|
||||
char c = _ctx.SkipWhite();
|
||||
|
||||
// Sign
|
||||
if (c == '-')
|
||||
@@ -394,6 +403,7 @@ namespace VAR.Json
|
||||
scratch.Append(c);
|
||||
c = _ctx.Next();
|
||||
}
|
||||
|
||||
while (char.IsDigit(c))
|
||||
{
|
||||
scratch.Append(c);
|
||||
@@ -411,38 +421,32 @@ namespace VAR.Json
|
||||
|
||||
// Build number from the parsed string
|
||||
string s = scratch.ToString();
|
||||
if (isFloat)
|
||||
{
|
||||
if (!isFloat) { return Convert.ToInt32(s); }
|
||||
|
||||
if (numberLenght < 17)
|
||||
{
|
||||
return Convert.ToDouble(s, CultureInfo.InvariantCulture);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
return Convert.ToDecimal(s, CultureInfo.InvariantCulture);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return Convert.ToInt32(s);
|
||||
}
|
||||
}
|
||||
|
||||
private object ParseArray(int recursiveCount = 1)
|
||||
private object? ParseArray(int recursiveCount = 1)
|
||||
{
|
||||
// StrictRules: Mark as tainted when MaxRecursiveCount is exceeded
|
||||
if (recursiveCount >= MaxRecursiveCount) { _tainted = true; }
|
||||
|
||||
bool correct = false;
|
||||
char c = _ctx.SkipWhite();
|
||||
List<object> array = new List<object>();
|
||||
Type arrayContentType = null;
|
||||
List<object?> array = [];
|
||||
Type? arrayContentType = null;
|
||||
bool hasSameType = true;
|
||||
bool hasNulls = false;
|
||||
if (c == '[')
|
||||
{
|
||||
_ctx.Next();
|
||||
}
|
||||
|
||||
bool? expectValue = null;
|
||||
do
|
||||
{
|
||||
@@ -451,6 +455,7 @@ namespace VAR.Json
|
||||
{
|
||||
// StrictRules: Mark as tainted when unexpected end of array
|
||||
if (expectValue == true) { _tainted = true; }
|
||||
|
||||
correct = true;
|
||||
_ctx.Next();
|
||||
break;
|
||||
@@ -467,14 +472,16 @@ namespace VAR.Json
|
||||
{
|
||||
// StrictRules: Mark as tainted when unexpected value on array
|
||||
if (expectValue == false) { _tainted = true; }
|
||||
object value = ParseValue(recursiveCount + 1);
|
||||
|
||||
object? value = ParseValue(recursiveCount + 1);
|
||||
array.Add(value);
|
||||
expectValue = false;
|
||||
|
||||
if (hasSameType)
|
||||
{
|
||||
Type valueType = value?.GetType();
|
||||
Type? valueType = value?.GetType();
|
||||
if (valueType == null) { hasNulls = true; }
|
||||
|
||||
if (arrayContentType == null || arrayContentType == valueType)
|
||||
{
|
||||
arrayContentType = valueType;
|
||||
@@ -486,21 +493,24 @@ namespace VAR.Json
|
||||
}
|
||||
}
|
||||
} while (!_ctx.AtEnd());
|
||||
|
||||
if (correct == false)
|
||||
{
|
||||
_tainted = true;
|
||||
}
|
||||
object result = array;
|
||||
|
||||
object? result = array;
|
||||
bool isNullableType = arrayContentType?.IsClass == true;
|
||||
if (hasSameType && arrayContentType != null && (isNullableType == true || (isNullableType == false && hasNulls == false)))
|
||||
if (hasSameType && arrayContentType != null && (isNullableType || (hasNulls == false)))
|
||||
{
|
||||
var enumerableType = typeof(System.Linq.Enumerable);
|
||||
var castMethod = enumerableType.GetMethod("Cast").MakeGenericMethod(arrayContentType);
|
||||
var toListMethod = enumerableType.GetMethod("ToList").MakeGenericMethod(arrayContentType);
|
||||
IEnumerable<object> itemsToCast = array;
|
||||
var castedItems = castMethod.Invoke(null, new[] { itemsToCast });
|
||||
result = toListMethod.Invoke(null, new[] { castedItems });
|
||||
Type enumerableType = typeof(System.Linq.Enumerable);
|
||||
MethodInfo? castMethod = enumerableType.GetMethod("Cast")?.MakeGenericMethod(arrayContentType);
|
||||
MethodInfo? toListMethod = enumerableType.GetMethod("ToList")?.MakeGenericMethod(arrayContentType);
|
||||
IEnumerable<object?> itemsToCast = array;
|
||||
object? castedItems = castMethod?.Invoke(null, [itemsToCast,]);
|
||||
result = toListMethod?.Invoke(null, [castedItems,]);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -511,13 +521,13 @@ namespace VAR.Json
|
||||
|
||||
bool correct = false;
|
||||
char c = _ctx.SkipWhite();
|
||||
Dictionary<string, object> obj = new Dictionary<string, object>();
|
||||
Dictionary<string, object?> obj = new Dictionary<string, object?>();
|
||||
if (c == '{')
|
||||
{
|
||||
_ctx.Next();
|
||||
}
|
||||
string attributeName = null;
|
||||
object attributeValue;
|
||||
|
||||
string attributeName = string.Empty;
|
||||
bool? expectedKey = null;
|
||||
bool? expectedValue = null;
|
||||
do
|
||||
@@ -528,7 +538,7 @@ namespace VAR.Json
|
||||
_ctx.Next();
|
||||
if (expectedValue == true)
|
||||
{
|
||||
attributeValue = ParseValue(recursiveCount + 1);
|
||||
object? attributeValue = ParseValue(recursiveCount + 1);
|
||||
obj.Add(attributeName, attributeValue);
|
||||
expectedKey = null;
|
||||
expectedValue = false;
|
||||
@@ -548,6 +558,7 @@ namespace VAR.Json
|
||||
{
|
||||
_tainted = true;
|
||||
}
|
||||
|
||||
correct = true;
|
||||
_ctx.Next();
|
||||
break;
|
||||
@@ -569,18 +580,20 @@ namespace VAR.Json
|
||||
}
|
||||
}
|
||||
} while (!_ctx.AtEnd());
|
||||
|
||||
if (correct == false)
|
||||
{
|
||||
_tainted = true;
|
||||
}
|
||||
|
||||
object result = TryConvertToTypes(obj);
|
||||
return result;
|
||||
}
|
||||
|
||||
private object ParseValue(int recusiveCount = 1)
|
||||
private object? ParseValue(int recursiveCount = 1)
|
||||
{
|
||||
char c = _ctx.SkipWhite();
|
||||
object token;
|
||||
object? token;
|
||||
switch (c)
|
||||
{
|
||||
case '"':
|
||||
@@ -594,11 +607,11 @@ namespace VAR.Json
|
||||
break;
|
||||
|
||||
case '{':
|
||||
token = ParseObject(recusiveCount);
|
||||
token = ParseObject(recursiveCount);
|
||||
break;
|
||||
|
||||
case '[':
|
||||
token = ParseArray(recusiveCount);
|
||||
token = ParseArray(recursiveCount);
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -609,15 +622,15 @@ namespace VAR.Json
|
||||
else
|
||||
{
|
||||
string aux = ParseString();
|
||||
if (aux.CompareTo("true") == 0)
|
||||
if (aux.Equals("true"))
|
||||
{
|
||||
token = true;
|
||||
}
|
||||
else if (aux.CompareTo("false") == 0)
|
||||
else if (aux.Equals("false"))
|
||||
{
|
||||
token = false;
|
||||
}
|
||||
else if (aux.CompareTo("null") == 0)
|
||||
else if (aux.Equals("null"))
|
||||
{
|
||||
token = null;
|
||||
}
|
||||
@@ -628,12 +641,15 @@ namespace VAR.Json
|
||||
{
|
||||
_ctx.Next();
|
||||
}
|
||||
|
||||
_tainted = true;
|
||||
token = null;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
return token;
|
||||
}
|
||||
|
||||
@@ -641,13 +657,13 @@ namespace VAR.Json
|
||||
|
||||
#region Public methods
|
||||
|
||||
public object Parse(string text)
|
||||
public object? Parse(string text)
|
||||
{
|
||||
// Get the first object
|
||||
_ctx = new ParserContext(text);
|
||||
_ctx.SetText(text);
|
||||
_tainted = false;
|
||||
_ctx.Mark();
|
||||
object obj = ParseValue();
|
||||
object? obj = ParseValue();
|
||||
_ctx.SkipWhite();
|
||||
if (_ctx.AtEnd())
|
||||
{
|
||||
@@ -666,19 +682,19 @@ namespace VAR.Json
|
||||
return obj;
|
||||
}
|
||||
|
||||
private static JsonParser _currentInstance = null;
|
||||
private static JsonParser? _currentInstance;
|
||||
|
||||
public static object ParseText(string text, params Type[] knownTypes)
|
||||
public static object? ParseText(string text, params Type[] knownTypes)
|
||||
{
|
||||
if (_currentInstance == null)
|
||||
{
|
||||
_currentInstance = new JsonParser();
|
||||
}
|
||||
|
||||
_currentInstance.KnownTypes.Clear();
|
||||
_currentInstance.KnownTypes.AddRange(knownTypes);
|
||||
return _currentInstance.Parse(text);
|
||||
}
|
||||
|
||||
#endregion Public methods
|
||||
}
|
||||
}
|
||||
@@ -2,90 +2,90 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
|
||||
namespace VAR.Json
|
||||
namespace VAR.Json;
|
||||
|
||||
public class JsonWriterConfiguration
|
||||
{
|
||||
public class JsonWriterConfiguration
|
||||
{
|
||||
private bool _indent;
|
||||
public bool Indent { get { return _indent; } }
|
||||
private readonly bool _indent;
|
||||
|
||||
private bool _useTabForIndent;
|
||||
public bool UseTabForIndent { get { return _useTabForIndent; } }
|
||||
public bool Indent => _indent;
|
||||
|
||||
private int _indentChars;
|
||||
public int IndentChars { get { return _indentChars; } }
|
||||
private readonly bool _useTabForIndent;
|
||||
|
||||
private int _indentThresold;
|
||||
public int IndentThresold { get { return _indentThresold; } }
|
||||
public bool UseTabForIndent => _useTabForIndent;
|
||||
|
||||
private readonly int _indentChars;
|
||||
|
||||
public int IndentChars => _indentChars;
|
||||
|
||||
private readonly int _indentThreshold;
|
||||
|
||||
public int IndentThreshold => _indentThreshold;
|
||||
|
||||
public JsonWriterConfiguration(
|
||||
bool indent = false,
|
||||
bool useTabForIndent = false,
|
||||
int indentChars = 4,
|
||||
int indentThresold = 3)
|
||||
int indentThreshold = 3)
|
||||
{
|
||||
_indent = indent;
|
||||
_useTabForIndent = useTabForIndent;
|
||||
_indentChars = indentChars;
|
||||
_indentThresold = indentThresold;
|
||||
_indentThreshold = indentThreshold;
|
||||
}
|
||||
|
||||
public bool Equals(JsonWriterConfiguration other)
|
||||
{
|
||||
return
|
||||
public bool Equals(JsonWriterConfiguration other) =>
|
||||
other.Indent == Indent &&
|
||||
other.UseTabForIndent == UseTabForIndent &&
|
||||
other.IndentChars == IndentChars &&
|
||||
other.IndentThresold == IndentThresold &&
|
||||
other.IndentThreshold == IndentThreshold &&
|
||||
true;
|
||||
|
||||
public override bool Equals(object? other)
|
||||
{
|
||||
if (other is JsonWriterConfiguration configuration)
|
||||
{
|
||||
return Equals(configuration);
|
||||
}
|
||||
|
||||
public override bool Equals(object other)
|
||||
{
|
||||
if (other is JsonWriterConfiguration)
|
||||
{
|
||||
return Equals(other as JsonWriterConfiguration);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public override int GetHashCode()
|
||||
{
|
||||
return _indent.GetHashCode() ^ _useTabForIndent.GetHashCode() ^ _indentChars.GetHashCode() ^ _indentThresold.GetHashCode();
|
||||
}
|
||||
return _indent.GetHashCode() ^ _useTabForIndent.GetHashCode() ^ _indentChars.GetHashCode() ^ _indentThreshold.GetHashCode();
|
||||
}
|
||||
}
|
||||
|
||||
public class JsonWriter
|
||||
{
|
||||
public class JsonWriter
|
||||
{
|
||||
#region Declarations
|
||||
|
||||
private JsonWriterConfiguration _config = null;
|
||||
private readonly JsonWriterConfiguration _config;
|
||||
|
||||
#endregion Declarations
|
||||
|
||||
#region Creator
|
||||
|
||||
public JsonWriter(JsonWriterConfiguration config = null)
|
||||
public JsonWriter(JsonWriterConfiguration? config = null)
|
||||
{
|
||||
_config = config;
|
||||
if (_config == null)
|
||||
{
|
||||
_config = new JsonWriterConfiguration();
|
||||
}
|
||||
_config = config ?? new JsonWriterConfiguration();
|
||||
}
|
||||
|
||||
#endregion Creator
|
||||
|
||||
#region Private methods
|
||||
|
||||
private bool IsValue(object obj)
|
||||
private bool IsValue(object? obj)
|
||||
{
|
||||
if (obj == null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (
|
||||
(obj is float) ||
|
||||
(obj is double) ||
|
||||
@@ -98,6 +98,7 @@ namespace VAR.Json
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -107,6 +108,7 @@ namespace VAR.Json
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
textWriter.Write('\n');
|
||||
if (_config.UseTabForIndent)
|
||||
{
|
||||
@@ -122,11 +124,10 @@ namespace VAR.Json
|
||||
private void WriteString(TextWriter textWriter, string str)
|
||||
{
|
||||
textWriter.Write('"');
|
||||
char c;
|
||||
int n = str.Length;
|
||||
for (int i = 0; i < n; i++)
|
||||
{
|
||||
c = str[i];
|
||||
char c = str[i];
|
||||
if (c == '"') { textWriter.Write("\\\""); }
|
||||
else if (c == '\\') { textWriter.Write("\\\\"); }
|
||||
else if (c == '/') { textWriter.Write("\\/"); }
|
||||
@@ -138,10 +139,11 @@ namespace VAR.Json
|
||||
else if (c < 32 || c >= 127) { textWriter.Write("\\u{0:X04}", (int)c); }
|
||||
else { textWriter.Write(c); }
|
||||
}
|
||||
|
||||
textWriter.Write('"');
|
||||
}
|
||||
|
||||
private void WriteValue(TextWriter textWriter, object obj, List<object> parentLevels)
|
||||
private void WriteValue(TextWriter textWriter, object? obj, List<object?> parentLevels)
|
||||
{
|
||||
if (obj == null || obj is DBNull)
|
||||
{
|
||||
@@ -159,43 +161,41 @@ namespace VAR.Json
|
||||
// Numbers
|
||||
textWriter.Write(obj.ToString());
|
||||
}
|
||||
else if (obj is string)
|
||||
else
|
||||
switch (obj)
|
||||
{
|
||||
case string valString:
|
||||
// Strings
|
||||
WriteString(textWriter, (string)obj);
|
||||
}
|
||||
else if (obj is bool)
|
||||
{
|
||||
WriteString(textWriter, valString);
|
||||
break;
|
||||
case bool valBool:
|
||||
// Booleans
|
||||
textWriter.Write(((bool)obj) ? "true" : "false");
|
||||
}
|
||||
else if (obj is DateTime)
|
||||
{
|
||||
textWriter.Write(valBool ? "true" : "false");
|
||||
break;
|
||||
case DateTime valDateTime:
|
||||
// DateTime
|
||||
textWriter.Write('"');
|
||||
textWriter.Write(((DateTime)obj).ToString("yyyy-MM-ddTHH:mm:ss"));
|
||||
textWriter.Write(valDateTime.ToString("yyyy-MM-ddTHH:mm:ss"));
|
||||
textWriter.Write('"');
|
||||
}
|
||||
else if (obj is IDictionary)
|
||||
{
|
||||
break;
|
||||
case IDictionary _:
|
||||
// Objects
|
||||
WriteObject(textWriter, obj, parentLevels);
|
||||
}
|
||||
else if (obj is IEnumerable)
|
||||
{
|
||||
break;
|
||||
case IEnumerable _:
|
||||
// Array/List
|
||||
WriteList(textWriter, obj, parentLevels);
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
default:
|
||||
// Reflected object
|
||||
WriteReflectedObject(textWriter, obj, parentLevels);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void WriteList(TextWriter textWriter, object obj, List<object> parentLevels)
|
||||
private void WriteList(TextWriter textWriter, object obj, List<object?> parentLevels)
|
||||
{
|
||||
IEnumerable list = (IEnumerable)obj;
|
||||
IEnumerable list = ((IEnumerable)obj).Cast<object>().ToList();
|
||||
int n = 0;
|
||||
|
||||
// Check if it is a leaf object
|
||||
@@ -206,6 +206,7 @@ namespace VAR.Json
|
||||
{
|
||||
isLeaf = false;
|
||||
}
|
||||
|
||||
n++;
|
||||
}
|
||||
|
||||
@@ -219,33 +220,37 @@ namespace VAR.Json
|
||||
// Write array
|
||||
bool first = true;
|
||||
textWriter.Write("[ ");
|
||||
if (!isLeaf || n > _config.IndentThresold)
|
||||
if (!isLeaf || n > _config.IndentThreshold)
|
||||
{
|
||||
WriteIndent(textWriter, parentLevels.Count + 1);
|
||||
}
|
||||
|
||||
foreach (object childObj in list)
|
||||
{
|
||||
if (!first)
|
||||
{
|
||||
textWriter.Write(", ");
|
||||
if (!isLeaf || n > _config.IndentThresold)
|
||||
if (!isLeaf || n > _config.IndentThreshold)
|
||||
{
|
||||
WriteIndent(textWriter, parentLevels.Count + 1);
|
||||
}
|
||||
}
|
||||
|
||||
first = false;
|
||||
parentLevels.Add(obj);
|
||||
WriteValue(textWriter, childObj, parentLevels);
|
||||
parentLevels.Remove(obj);
|
||||
}
|
||||
if (!isLeaf || n > _config.IndentThresold)
|
||||
|
||||
if (!isLeaf || n > _config.IndentThreshold)
|
||||
{
|
||||
WriteIndent(textWriter, parentLevels.Count);
|
||||
}
|
||||
|
||||
textWriter.Write(" ]");
|
||||
}
|
||||
|
||||
private void WriteObject(TextWriter textWriter, object obj, List<object> parentLevels)
|
||||
private void WriteObject(TextWriter textWriter, object obj, List<object?> parentLevels)
|
||||
{
|
||||
IDictionary map = (IDictionary)obj;
|
||||
int n = map.Count;
|
||||
@@ -271,46 +276,51 @@ namespace VAR.Json
|
||||
// Write object
|
||||
bool first = true;
|
||||
textWriter.Write("{ ");
|
||||
if (!isLeaf || n > _config.IndentThresold)
|
||||
if (!isLeaf || n > _config.IndentThreshold)
|
||||
{
|
||||
WriteIndent(textWriter, parentLevels.Count + 1);
|
||||
}
|
||||
|
||||
foreach (object key in map.Keys)
|
||||
{
|
||||
object value = map[key];
|
||||
object? value = map[key];
|
||||
if (!first)
|
||||
{
|
||||
textWriter.Write(", ");
|
||||
if (!isLeaf || n > _config.IndentThresold)
|
||||
if (!isLeaf || n > _config.IndentThreshold)
|
||||
{
|
||||
WriteIndent(textWriter, parentLevels.Count + 1);
|
||||
}
|
||||
}
|
||||
|
||||
first = false;
|
||||
WriteString(textWriter, Convert.ToString(key));
|
||||
WriteString(textWriter, Convert.ToString(key) ?? string.Empty);
|
||||
textWriter.Write(": ");
|
||||
parentLevels.Add(obj);
|
||||
WriteValue(textWriter, value, parentLevels);
|
||||
parentLevels.Remove(obj);
|
||||
}
|
||||
if (!isLeaf || n > _config.IndentThresold)
|
||||
|
||||
if (!isLeaf || n > _config.IndentThreshold)
|
||||
{
|
||||
WriteIndent(textWriter, parentLevels.Count);
|
||||
}
|
||||
|
||||
textWriter.Write(" }");
|
||||
}
|
||||
|
||||
private void WriteReflectedObject(TextWriter textWriter, object obj, List<object> parentLevels)
|
||||
private void WriteReflectedObject(TextWriter textWriter, object obj, List<object?> parentLevels)
|
||||
{
|
||||
Type type = obj.GetType();
|
||||
PropertyInfo[] rawProperties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);
|
||||
List<PropertyInfo> properties = new List<PropertyInfo>();
|
||||
List<PropertyInfo> properties = [];
|
||||
foreach (PropertyInfo property in rawProperties)
|
||||
{
|
||||
if (property.CanRead == false) { continue; }
|
||||
|
||||
properties.Add(property);
|
||||
}
|
||||
|
||||
int n = properties.Count;
|
||||
|
||||
// Empty
|
||||
@@ -324,7 +334,7 @@ namespace VAR.Json
|
||||
bool isLeaf = true;
|
||||
foreach (PropertyInfo property in properties)
|
||||
{
|
||||
object value = property.GetValue(obj, null);
|
||||
object? value = property.GetValue(obj, null);
|
||||
if (!IsValue(value))
|
||||
{
|
||||
isLeaf = false;
|
||||
@@ -335,27 +345,30 @@ namespace VAR.Json
|
||||
// Write object
|
||||
bool first = true;
|
||||
textWriter.Write("{ ");
|
||||
if (!isLeaf || n > _config.IndentThresold)
|
||||
if (!isLeaf || n > _config.IndentThreshold)
|
||||
{
|
||||
WriteIndent(textWriter, parentLevels.Count + 1);
|
||||
}
|
||||
|
||||
foreach (PropertyInfo property in properties)
|
||||
{
|
||||
object value = null;
|
||||
MethodInfo getMethod = property.GetGetMethod();
|
||||
ParameterInfo[] parameters = getMethod.GetParameters();
|
||||
object? value = null;
|
||||
MethodInfo? getMethod = property.GetGetMethod();
|
||||
ParameterInfo[] parameters = getMethod?.GetParameters() ?? [];
|
||||
if (parameters.Length == 0)
|
||||
{
|
||||
value = property.GetValue(obj, null);
|
||||
}
|
||||
|
||||
if (!first)
|
||||
{
|
||||
textWriter.Write(", ");
|
||||
if (!isLeaf || n > _config.IndentThresold)
|
||||
if (!isLeaf || n > _config.IndentThreshold)
|
||||
{
|
||||
WriteIndent(textWriter, parentLevels.Count + 1);
|
||||
}
|
||||
}
|
||||
|
||||
first = false;
|
||||
WriteString(textWriter, property.Name);
|
||||
textWriter.Write(": ");
|
||||
@@ -368,12 +381,15 @@ namespace VAR.Json
|
||||
{
|
||||
WriteValue(textWriter, null, parentLevels);
|
||||
}
|
||||
|
||||
parentLevels.Remove(obj);
|
||||
}
|
||||
if (!isLeaf || n > _config.IndentThresold)
|
||||
|
||||
if (!isLeaf || n > _config.IndentThreshold)
|
||||
{
|
||||
WriteIndent(textWriter, parentLevels.Count);
|
||||
}
|
||||
|
||||
textWriter.Write(" }");
|
||||
}
|
||||
|
||||
@@ -381,33 +397,31 @@ namespace VAR.Json
|
||||
|
||||
#region Public methods
|
||||
|
||||
public TextWriter Write(object obj, TextWriter textWriter)
|
||||
public TextWriter Write(object obj, TextWriter? textWriter)
|
||||
{
|
||||
if (textWriter == null)
|
||||
{
|
||||
textWriter = new StringWriter();
|
||||
}
|
||||
WriteValue(textWriter, obj, new List<object>());
|
||||
textWriter ??= new StringWriter();
|
||||
|
||||
WriteValue(textWriter, obj, []);
|
||||
return textWriter;
|
||||
}
|
||||
|
||||
public string Write(object obj)
|
||||
{
|
||||
StringWriter textWriter = new StringWriter();
|
||||
WriteValue(textWriter, obj, new List<object>());
|
||||
StringWriter textWriter = new();
|
||||
WriteValue(textWriter, obj, []);
|
||||
return textWriter.ToString();
|
||||
}
|
||||
|
||||
private static Dictionary<JsonWriterConfiguration, JsonWriter> _dictInstances = new Dictionary<JsonWriterConfiguration, JsonWriter>();
|
||||
private static readonly Dictionary<JsonWriterConfiguration, JsonWriter> _dictInstances = new();
|
||||
|
||||
public static string WriteObject(object obj,
|
||||
JsonWriterConfiguration config = null,
|
||||
JsonWriterConfiguration? config = null,
|
||||
bool indent = false,
|
||||
bool useTabForIndent = false,
|
||||
int indentChars = 4,
|
||||
int indentThresold = 3)
|
||||
int indentThreshold = 3)
|
||||
{
|
||||
JsonWriter jsonWriter = null;
|
||||
JsonWriter? jsonWriter = null;
|
||||
|
||||
if (config != null)
|
||||
{
|
||||
@@ -420,6 +434,7 @@ namespace VAR.Json
|
||||
{
|
||||
jsonWriter = _dictInstances[config];
|
||||
}
|
||||
|
||||
return jsonWriter.Write(obj);
|
||||
}
|
||||
|
||||
@@ -429,23 +444,24 @@ namespace VAR.Json
|
||||
pair.Key.Indent == indent &&
|
||||
pair.Key.UseTabForIndent == useTabForIndent &&
|
||||
pair.Key.IndentChars == indentChars &&
|
||||
pair.Key.IndentThresold == indentThresold &&
|
||||
pair.Key.IndentThreshold == indentThreshold &&
|
||||
true)
|
||||
{
|
||||
jsonWriter = pair.Value;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (jsonWriter != null)
|
||||
{
|
||||
return jsonWriter.Write(obj);
|
||||
}
|
||||
|
||||
JsonWriterConfiguration jsonWriterConfiguration = new JsonWriterConfiguration(
|
||||
JsonWriterConfiguration jsonWriterConfiguration = new(
|
||||
indent: indent,
|
||||
useTabForIndent: useTabForIndent,
|
||||
indentChars: indentChars,
|
||||
indentThresold: indentThresold);
|
||||
indentThreshold: indentThreshold);
|
||||
jsonWriter = new JsonWriter(jsonWriterConfiguration);
|
||||
_dictInstances.Add(jsonWriterConfiguration, jsonWriter);
|
||||
|
||||
@@ -453,5 +469,4 @@ namespace VAR.Json
|
||||
}
|
||||
|
||||
#endregion Public methods
|
||||
}
|
||||
}
|
||||
@@ -2,31 +2,24 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq.Expressions;
|
||||
|
||||
namespace VAR.Json
|
||||
namespace VAR.Json;
|
||||
|
||||
public static class ObjectActivator
|
||||
{
|
||||
public class ObjectActivator
|
||||
{
|
||||
private static readonly Dictionary<Type, Func<object>> _creators = new Dictionary<Type, Func<object>>();
|
||||
private static readonly Dictionary<Type, Func<object>> _creators = new();
|
||||
|
||||
public static Func<object> GetLambdaNew(Type type)
|
||||
private static Func<object> GetLambdaNew(Type type)
|
||||
{
|
||||
if (_creators.ContainsKey(type))
|
||||
{
|
||||
return _creators[type];
|
||||
}
|
||||
|
||||
lock (_creators)
|
||||
{
|
||||
if (_creators.ContainsKey(type))
|
||||
{
|
||||
return _creators[type];
|
||||
}
|
||||
if (_creators.TryGetValue(type, out Func<object>? creator)) { return creator; }
|
||||
|
||||
NewExpression newExp = Expression.New(type);
|
||||
LambdaExpression lambda = Expression.Lambda(typeof(Func<object>), newExp);
|
||||
Func<object> compiledLambdaNew = (Func<object>)lambda.Compile();
|
||||
|
||||
_creators.Add(type, compiledLambdaNew);
|
||||
|
||||
return _creators[type];
|
||||
}
|
||||
}
|
||||
@@ -36,5 +29,4 @@ namespace VAR.Json
|
||||
Func<object> creator = GetLambdaNew(type);
|
||||
return creator();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,21 +1,19 @@
|
||||
using System;
|
||||
namespace VAR.Json;
|
||||
|
||||
namespace VAR.Json
|
||||
public class ParserContext
|
||||
{
|
||||
public class ParserContext
|
||||
{
|
||||
#region Declarations
|
||||
|
||||
private string _text;
|
||||
private string _text = string.Empty;
|
||||
private int _length;
|
||||
private int _i;
|
||||
private int _markStart;
|
||||
|
||||
#endregion Declarations
|
||||
|
||||
#region Creator
|
||||
#region Public methods
|
||||
|
||||
public ParserContext(string text)
|
||||
public void SetText(string text)
|
||||
{
|
||||
_text = text;
|
||||
_length = text.Length;
|
||||
@@ -23,20 +21,18 @@ namespace VAR.Json
|
||||
_markStart = 0;
|
||||
}
|
||||
|
||||
#endregion Creator
|
||||
|
||||
#region Public methods
|
||||
|
||||
public char SkipWhite()
|
||||
{
|
||||
while (_i < _length && char.IsWhiteSpace(_text[_i]))
|
||||
{
|
||||
_i++;
|
||||
}
|
||||
|
||||
if (AtEnd())
|
||||
{
|
||||
return (char)0;
|
||||
}
|
||||
|
||||
return _text[_i];
|
||||
}
|
||||
|
||||
@@ -47,6 +43,7 @@ namespace VAR.Json
|
||||
{
|
||||
return (char)0;
|
||||
}
|
||||
|
||||
return _text[_i];
|
||||
}
|
||||
|
||||
@@ -66,19 +63,11 @@ namespace VAR.Json
|
||||
{
|
||||
return _text.Substring(_markStart, _i - _markStart);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (_markStart < _length)
|
||||
{
|
||||
return _text.Substring(_markStart, _length - _markStart);
|
||||
}
|
||||
else
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
return _markStart < _length
|
||||
? _text.Substring(_markStart, _length - _markStart)
|
||||
: string.Empty;
|
||||
}
|
||||
|
||||
#endregion Public methods
|
||||
}
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
using System.Reflection;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
[assembly: AssemblyTitle("VAR.Json")]
|
||||
[assembly: AssemblyDescription(".Net library for JSON parsing")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("VAR")]
|
||||
[assembly: AssemblyProduct("VAR.Json")]
|
||||
[assembly: AssemblyCopyright("Copyright © VAR 2016-2017")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
[assembly: ComVisible(false)]
|
||||
[assembly: Guid("28b3f937-145c-4fd4-a75b-a25ea4cc0428")]
|
||||
[assembly: AssemblyVersion("1.2.0.*")]
|
||||
@@ -1,84 +1,33 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{28B3F937-145C-4FD4-A75B-A25EA4CC0428}</ProjectGuid>
|
||||
<TargetFramework>net9.0</TargetFramework>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>VAR.Json</RootNamespace>
|
||||
<AssemblyName>VAR.Json</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<IsPackable>true</IsPackable>
|
||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
||||
<Nullable>enable</Nullable>
|
||||
<LangVersion>default</LangVersion>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug .Net 4.6.1|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\net461</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
|
||||
<LangVersion>6</LangVersion>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release .Net 4.6.1|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\net461</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
|
||||
<LangVersion>6</LangVersion>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug .Net 3.5|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\net35</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
|
||||
<LangVersion>6</LangVersion>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release .Net 3.5|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\net35</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
|
||||
<LangVersion>6</LangVersion>
|
||||
<PropertyGroup>
|
||||
<PackageId>VAR.Json</PackageId>
|
||||
<Title>VAR.Json</Title>
|
||||
<Version>1.2.2</Version>
|
||||
<Description>.Net library for JSON parsing</Description>
|
||||
<Authors>VAR</Authors>
|
||||
<Company>VAR</Company>
|
||||
<Copyright>Copyright © VAR 2016-2022</Copyright>
|
||||
<RequireLicenseAcceptance>false</RequireLicenseAcceptance>
|
||||
<PackageLicenseFile>LICENSE.txt</PackageLicenseFile>
|
||||
<PackageProjectUrl>https://github.com/Kableado/VAR.Json</PackageProjectUrl>
|
||||
<PackageTags>JSON;JSON Library</PackageTags>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core" />
|
||||
<Content Include="..\LICENSE.txt" Link="LICENSE.txt" Pack="true" PackagePath=""/>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="JsonParser.cs" />
|
||||
<Compile Include="JsonWriter.cs" />
|
||||
<Compile Include="ObjectActivator.cs" />
|
||||
<Compile Include="ParserContext.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="Build.NuGet.cmd" />
|
||||
<None Include="packages.config" />
|
||||
<None Include="VAR.Json.nuspec" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="Nuget\keep.txt" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
<Target Name="CopyPackage" AfterTargets="Pack">
|
||||
<Copy
|
||||
SourceFiles="$(OutputPath)..\$(PackageId).$(PackageVersion).nupkg"
|
||||
DestinationFolder="Nuget\"
|
||||
/>
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
|
||||
</Project>
|
||||
@@ -1,22 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<package >
|
||||
<metadata>
|
||||
<id>$id$</id>
|
||||
<version>$version$</version>
|
||||
<title>$title$</title>
|
||||
<authors>$author$</authors>
|
||||
<owners>$author$</owners>
|
||||
<licenseUrl>https://github.com/Kableado/VAR.Json/blob/master/LICENSE.txt</licenseUrl>
|
||||
<projectUrl>https://github.com/Kableado/VAR.Json</projectUrl>
|
||||
<requireLicenseAcceptance>false</requireLicenseAcceptance>
|
||||
<description>$description$</description>
|
||||
<copyright>Copyright VAR 2016-2017</copyright>
|
||||
<tags>JSON Library</tags>
|
||||
</metadata>
|
||||
<files>
|
||||
<file src="bin\Release\net461\VAR.Json.dll" target="lib\net461\VAR.Json.dll" />
|
||||
<file src="bin\Release\net461\VAR.Json.pdb" target="lib\net461\VAR.Json.pdb" />
|
||||
<file src="bin\Release\net35\VAR.Json.dll" target="lib\net35\VAR.Json.dll" />
|
||||
<file src="bin\Release\net35\VAR.Json.pdb" target="lib\net35\VAR.Json.pdb" />
|
||||
</files>
|
||||
</package>
|
||||
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="NuGet.CommandLine" version="3.4.3" targetFramework="net461" developmentDependency="true" />
|
||||
</packages>
|
||||
Reference in New Issue
Block a user