将Json反序列化为Entity Framework无法将int转换为type

时间:2018-12-15 03:12:07

标签: c# json entity-framework

我一直在尝试反序列化包含表示颜色的整数列表的Json字符串,然后使用Entity Framework将其插入到sql数据库中。我是Entity Framework的新手,并且读到它不支持原始类型的集合,我想解决这个问题,可以添加类

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

,然后在CharacterColor类中创建一个列表以保存int

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,并用新的对象数组替换了colors数组

 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 :(得分:2)

在Json中,您将颜色定义为一个整数数组,而不是新Colors类的对象数组。应该更像颜色:[{Id:0,Color:255},{Id:2,Color:255},.......]

因此JSON不正确,在json中,colors数组基本上是作为列表发送的

location @public { auth_basic off; } location @webdav { proxy_set_header Host $host; proxy_pass http://localhost:8080; } location / { # WebDAV server if ($request_method != GET) { error_page 418 = @webdav; return 418; } gzip on; fancyindex on; location ~ /(public|\.well-known)/ { # WebDAV server if ($request_method != GET) { error_page 418 = @webdav; return 418; } if ($remote_user = "") { error_page 418 = @public; return 418; } } location = /robots.txt { # WebDAV server if ($request_method != GET) { error_page 418 = @webdav; return 418; } add_header Content-Type text/plain; return 200 "User-agent: *\nDisallow: /\n"; } }

但是.net期望以下内容更像是列表

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]

因此您可以执行以下任一操作:

  1. 更改发送JSON的内容以发送{int,int}对象数组而不是ints数组。
  2. 将列表更改为列表,然后更新所有.net代码以进行调整。
  3. 编写一个自定义的Json转换器,以将您拥有的json转换为您拥有的.net。

您应该执行1或2,因为您的数据似乎不够复杂,无法完成3的工作。