Десериализация Json в Entity Framework не может преобразовать int в тип - PullRequest
0 голосов
/ 15 декабря 2018

Я пытался десериализовать строку Json, которая содержит список целых чисел, представляющих цвета, которые затем вставляются в базу данных sql с использованием Entity Framework.Я довольно новичок в Entity Framework и прочитал, что он не поддерживает коллекции примитивных типов, я решил обойти это, я мог бы добавить класс

public class Colors
{
    public int Id { get; set; }
    public int Color { get; set; }        
}

, а затем создать список в классе CharacterColorдля хранения целых чисел

public List<Colors> Colors { get; set; }

Однако при попытке десериализации Json появляется ошибка.

Newtonsoft.Json.JsonSerializationException: «Ошибка преобразования значения 255 в тип» ORAC.Data.Entities.Colors.Путь 'characterColors [0] .colors [0]', строка 1, позиция 1200. 'ArgumentException: Не удалось привести или преобразовать из System.Int64 в ORAC.Data.Entities.Colors.

Может ли кто-либо с большим опытом работы с Entity Framework увидеть, в чем я ошибаюсь.

Character character = JsonConvert.DeserializeObject<Character>(jsonString);

Строка Json

"{\"packedRecipeType\":\"DynamicCharacterAvatar\",\"name\":\"Character\",\"race\":\"HumanMaleHighPoly\",\"dna\":[{\"dnaType\":\"UMADnaHumanoid\",\"dnaTypeHash\":-212795365,\"packedDna\":\"{\\\"height\\\":128,\\\"headSize\\\":128,\\\"headWidth\\\":93,\\\"neckThickness\\\":108,\\\"armLength\\\":135,\\\"forearmLength\\\":128,\\\"armWidth\\\":116,\\\"forearmWidth\\\":128,\\\"handsSize\\\":118,\\\"feetSize\\\":109,\\\"legSeparation\\\":128,\\\"upperMuscle\\\":129,\\\"lowerMuscle\\\":152,\\\"upperWeight\\\":128,\\\"lowerWeight\\\":81,\\\"legsSize\\\":134,\\\"belly\\\":66,\\\"waist\\\":108,\\\"gluteusSize\\\":38,\\\"earsSize\\\":121,\\\"earsPosition\\\":233,\\\"earsRotation\\\":61,\\\"noseSize\\\":115,\\\"noseCurve\\\":128,\\\"noseWidth\\\":124,\\\"noseInclination\\\":128,\\\"nosePosition\\\":128,\\\"nosePronounced\\\":128,\\\"noseFlatten\\\":118,\\\"chinSize\\\":128,\\\"chinPronounced\\\":128,\\\"chinPosition\\\":128,\\\"mandibleSize\\\":128,\\\"jawsSize\\\":128,\\\"jawsPosition\\\":128,\\\"cheekSize\\\":128,\\\"cheekPosition\\\":128,\\\"lowCheekPronounced\\\":128,\\\"lowCheekPosition\\\":195,\\\"foreheadSize\\\":128,\\\"foreheadPosition\\\":128,\\\"lipsSize\\\":128,\\\"mouthSize\\\":128,\\\"eyeRotation\\\":128,\\\"eyeSize\\\":69,\\\"breastSize\\\":128}\"},{\"dnaType\":\"UMADnaTutorial\",\"dnaTypeHash\":-1679007774,\"packedDna\":\"{\\\"eyeSpacing\\\":128}\"}],\"characterColors\":[{\"name\":\"Skin\",\"colors\":[255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0]},{\"name\":\"Hair\",\"colors\":[255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0]},{\"name\":\"Eyes\",\"colors\":[255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0]},{\"name\":\"Undies\",\"colors\":[255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0]}],\"wardrobeSet\":[{\"slot\":\"Underwear\",\"recipe\":\"MaleUnderwear\"}],\"raceAnimatorController\":\"Locomotion\"}"

Сущность

public class Character
{
    public int UserId { get; set; }
    public int CharacterId { get; set; }
    public string CharacterName { get; set; }

    public string PackedRecipeType { get; set; }
    public string Name { get; set; }
    public string Race { get; set; }
    public List<Dna> Dna { get; set; }
    public List<CharacterColor> CharacterColors { get; set; }
    public List<WardrobeSet> WardrobeSet { get; set; }        
    public string RaceAnimatorController { get; set; }

    public User User { get; set; }
}

public class Dna
{
    public int Id { get; set; }
    public string DnaType { get; set; }
    public int DnaTypeHash { get; set; }
    public string PackedDna { get; set; }
}

public class CharacterColor
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Colors> Colors { get; set; }
}

public class WardrobeSet
{
    public int Id { get; set; }
    public string Slot { get; set; }
    public string Recipe { get; set; }
}

public class Colors
{
    public int Id { get; set; }
    public int Color { get; set; }        
}

Решение Я обновилJson и заменил массив цветов новым массивом объектов

 JObject jsonToParse = JObject.Parse(jsonString);            
        JArray characterColors = (JArray)jsonToParse["characterColors"];

        foreach(var item in characterColors)
        {
            JArray colors = (JArray)item["colors"];
            JArray newColorsArray = new JArray();
            var i = 0;
            foreach (var col in colors)
            {
                var color = new Color
                {
                    ColorId = i,
                    Value = (int)col
                };
                newColorsArray.Add(JToken.FromObject(color));
                i++;
            }
            colors.Replace(newColorsArray);
        }

1 Ответ

0 голосов
/ 15 декабря 2018

В вашем Json цвета определены как массив целых, а не как массив объектов вашего нового класса Colors.Должно быть больше похоже на цвета: [{Id: 0, Color: 255}, {Id: 2, Color: 255}, .......]

Так что JSON неверен, в jsonмассив цветов отправляется в виде списка в основном

colors: [255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0]

, но .net ожидает нечто похожее на следующее, которое больше похоже на список

colors: [{Id:0, Color:255},{Id:1, Color:255}, ...]

Таким образом, вы можете сделать любое из следующего:

  1. Измените все, что посылает ваш JSON, чтобы посылать массив объектов {int, int} вместо массива int.
  2. Измените свой Список на Список, а затем обновите весь свой код .net, чтобы настроить его.
  3. Напишите специальный конвертер Json для преобразования из имеющегося у вас json в имеющийся .net..

Вы должны сделать 1 или 2, так как ваши данные не кажутся достаточно сложными, чтобы пройти усилие 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...