System.Text. Json .JsonDocument.Parse массив объектов - PullRequest
1 голос
/ 01 апреля 2020

Я пытаюсь выполнить синтаксический анализ ниже json, используя System.Text.Json.JsonDocument

[
    {
        "Name" : "Test 2",
        "NumberOfComponents" : 1,
        "IsActive" : true,
        "CreatedBy" : "bsharma"
    },
    {
        "Name" : "Test 2",
        "NumberOfComponents" : 1,
        "IsActive" : true,
        "CreatedBy" : "bsharma"
    }
]

Код для анализа:

 using var jsonDoc = JsonDocument.Parse(inputStream, _jsonDocumentOptions);

Сбой анализа с ошибкой:

System.Text.Json.JsonReaderException
  HResult=0x80131500
  Message='[' is an invalid start of a property name. Expected a '"'. LineNumber: 1 | BytePositionInLine: 4.
  Source=System.Text.Json
  StackTrace:
   at System.Text.Json.ThrowHelper.ThrowJsonReaderException(Utf8JsonReader& json, ExceptionResource resource, Byte nextByte, ReadOnlySpan`1 bytes)
   at System.Text.Json.Utf8JsonReader.ReadSingleSegment()
   at System.Text.Json.Utf8JsonReader.Read()
   at System.Text.Json.JsonDocument.Parse(ReadOnlySpan`1 utf8JsonSpan, Utf8JsonReader reader, MetadataDb& database, StackRowStack& stack)
   at System.Text.Json.JsonDocument.Parse(ReadOnlyMemory`1 utf8Json, JsonReaderOptions readerOptions, Byte[] extraRentedBytes)
   at System.Text.Json.JsonDocument.Parse(Stream utf8Json, JsonDocumentOptions options)

Вход json отправляется через HTTP-запрос. В сообщении об ошибке указывается поместить массив в свойство в форме { "values" : [ .. ] }, что решает проблему. Есть ли способ получить экземпляр JsonDocument для исходного json или исходный json недействителен?

РЕДАКТИРОВАТЬ: json происходит от сериализации массива:

    var jsonOptions = new JsonSerializerOptions
    {
        WriteIndented = true
    };

    var pocos = new Container[]
    {
        new Container { Name= "Test 2", NumberOfComponents = 2, IsActive = true ,CreatedBy = "bsharma" },
        new Container { Name= "Test 2", NumberOfComponents = 2, IsActive = true ,CreatedBy = "bsharma" }
    };
    var json = JsonSerializer.Serialize(pocos, jsonOptions);

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

Нет опции в System.Text.Json или Newtonsoft.Json до Deserialize a Json Array без Имени, но вы можете изменить Json String во время выполнения:

public class SampleList
{
    public List<Sample> Samples { get; set; }
}


public class Sample
{
    public string Name { get; set; }
    public int NumberOfComponents { get; set; }
    public bool IsActive { get; set; }
    public string CreatedBy { get; set; }
}


static void Main(string[] args)
{
    var _jsonDocumentOptions = new JsonSerializerOptions();

    var inputStream = File.ReadAllText("json.txt");

    // Add Json Array name
    inputStream = inputStream.Replace(@"[", "\"Samples\":[");

    var sample = JsonSerializer.Deserialize<SampleList>(inputStream, _jsonDocumentOptions);
}
0 голосов
/ 01 апреля 2020

Оригинал JSON недействителен.

Проверьте синтаксис json на https://www.json.org/json-en.html

Конечно, вы можете вручную обрезать первые / последние фигурные скобки из json string, а затем анализирует rest как массив, но это не совпадает с "экземпляром JsonDocument для оригинального json" в вашем вопросе.

...