C # - При синтаксическом анализе значения обнаружен неожиданный символ: {.Путь '[0]. Статистика - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь десериализовать объект JSON в соответствии с моей моделью, используя код ниже:

LoadData<MyModel>(Data.Stats, null);

public void LoadData<TModel>(string data, JsonSerializerSettings jsonSettings) where TModel : class
{
    var mockData = JsonConvert.DeserializeObject<Collection<TModel>>(data, jsonSettings); // ERROR HERE
    Context.SaveChanges();
}

Однако я получаю сообщение об ошибке

Newtonsoft.Json.JsonReaderException: 'При синтаксическом анализе значения обнаружен неожиданный символ: {.Путь '[0] .Statistics', строка 7, позиция 19. '

Мой объект JSON:

[
  {
    "Id": 3033,
    "Grade": 3,
    "Statistics": { //ERROR OCCURS ON THIS PROPERTY
      "Avatar.Add": 1,
      "TotalPlays": 36,
      "Game.TotalPlays.Spell_Mem_Words": 27,
      "Book.TotalReads.Count": 23,
      "Game.TotalPlays.Count": 39,
      "Character.TotalPlays.L": 23,
      "Character.TotalPlays.E": 3,
      "TotalPlays.Pick_Vocab": 16,
      "Character.TotalPlays.R": 22
    }
  }
]

Модель объекта:

public class MyModel
{
    public int Id { get; set; }
    public int Grade { get; set; }
    public string Statistics { get; set; } 
}

Вещи, которые я пробовал

(1) Используя json lint Я убедился, что строка json действительна.

(2)В javascript работает сериализация объекта с обратными галочками вокруг него.Обратные пометки не работают в C # JS Fiddle

(3) Попытка создать свойство Statistics в объектной модели, чтобы использовать класс с именем stats вместо строки, такой как

public class Stats 
{
    public string Label { get; set;}
    public int Value { get; set; }
}

(4) Опробовал почти все ответы на этот пост

К сожалению, я до сих пор не решил эту проблему.Есть идеи?

1 Ответ

0 голосов
/ 30 ноября 2018

Мне удалось воспроизвести проблему с этим MCVE:

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DeserializeJson
{
    /**
     * REFERENCE:
     * /11597480/c-pri-sintaksicheskom-analize-znacheniya-obnaruzhen-neozhidannyi-simvol-put-0-statistika
     *
     * ORIGINAL ERROR:
     * "Unexpected character encountered while parsing value: {. Path '[0].Statistics', line 5, position 19."
     */
     public class Stats
     {
         public string Label { get; set; }
         public int Value { get; set; }
     }

     public class MyModel
     {
         public int Id { get; set; }
         public int Grade { get; set; }
         public string Statistics { get; set; }
     }

    class Program
    {
        static Collection<MyModel> LoadData(string data)
        {
            var retval = JsonConvert.DeserializeObject<Collection<MyModel>>(data);
            return retval;
        }

        static void Main(string[] args)
        {
            try
            {
                string s = File.ReadAllText(@"test-data.json");
                JsonConvert.DefaultSettings = () => new JsonSerializerSettings
                {
                    Formatting = Newtonsoft.Json.Formatting.Indented
                };
                Collection <MyModel> mockData = Program.LoadData(s);
                System.Console.WriteLine("#/items= " + mockData.Count);
                foreach (MyModel item in mockData)
                {
                    System.Console.WriteLine("  id= {0}, Grade={1}, Statistics={2}", item.Id, item.Grade, item.Statistics.ToString());
                }
            }
            catch (Exception ex)
            {
                System.Console.WriteLine("ERROR:", ex);
            }
        }
    }
}

Мне удалось исправить это следующим образом:

  1. Разработка вашего определения class Stats, затем
  2. Использование статистики в определении class MyModel:

    public class Stats
    {
        public int AvatarAdd { get; set; }
        public int TotalPlays { get; set; }
        public int GameTotalPlaysSpellMemWords { get; set; }
        public int BookTotalReadsCount { get; set; }
        public int GameTotalPlaysCount { get; set; }
        public int CharacterTotalPlaysL { get; set; }
        public int CharacterTotalPlaysE { get; set; }
        public int TotalPlaysPick_Vocab { get; set; }
        public int CharacterTotalPlaysR { get; set; }
    }
    
    public class MyModel
    {
        public int Id { get; set; }
        public int Grade { get; set; }
        public Stats Statistics { get; set; }
    }
    

У вас есть несколько вариантов выбора (в том числе дословно использовать приведенный выше пример).Мое предложение состоит в том, чтобы разбить «Статистика» на более мелкие классы моделей.

...