Search code examples
postgresqlentity-frameworkasp.net-corec#-4.0entity-framework-6

Error "The JSON value could not be converted to System.String. Path: $[1].Interests[1].Meta[9].Content | LineNumber: 0 | BytePositionInLine: 10073."


public Class Employee{

  public string Name { get; set; }

  [Column(TypeName = "jsonb")]
  public List<Section> Sections { get; set; }

}

public Class Sections{

   public string Booking { get; set; }


  [Column(TypeName = "jsonb")]
  public List<Interest> Interests { get; set; }

}

public Class Interest{

  public string Title { get; set; }

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


  public List<WithAlt> Images { get; set; }
}

public Class Meta{

      public string Type { get; set; }

     public string Content { get; set; }

}

public Class WithAlt{

     public string content { get; set; }

     public string Alt { get; set; }

}

I fetch data from the Employee table

Employee while fetching the data Sections Column I got

The JSON value could not be converted to System.String. Path: $[1].Interests[1].Meta[9].Content | LineNumber: 0 | BytePositionInLine: 10073. 

Error at

public Task<Employee> CheckEmployee(string name){

// error throw Line
var query= await catalogDbContext.Employee
             .Where(i.Name === name)
            .FirstOrDefault();
}

Not for all value but some value that List<Section> or List<Interest> or List<Meta> or List<WithAlt> have null value

When I manually add the value to sections column bellow

{
  "Booking": "",
  "Interests":[
   {
       "Title":"",

       "Meta":[

          { 
           
             "Type" : " ", 
          
              "Content" : " "
          }
         ],

     "Images" : [
      {
         "content" : " ",

         "alt" : " "
      }
    ]
  }
],

  }

it will not throw the error

Are there any way to define the default value to the above fields using code first approach

when I initialize Sections property like

public List<Section> Sections { get; set; }={};

it shows the following error

Can only use array initializer expressions to assign to array types. Try using a new expression instead.

and also

public List<Section> Sections { get; set; }= new List<Section> Sections();

and

public List<Meta> Meta { get; set; }= = new List<Meta>();

and

public List<WithAlt> Images { get; set; }= new List<WithAlt>();

throw Error "The JSON value could not be converted to System.String. Path: $[1].Interests[1].Meta[9].Content | LineNumber: 0 | BytePositionInLine: 10073."


Solution

  • Can only use array initializer expressions to assign to array types. Try using a new expression instead.

    You can convert the json data to Section type rather than List<Section> type.

    var json = "{\"Booking\":\"\",\"Interests\":[{\"Title\":\"\",\"Meta\":[{\"Type\":\" \",\"Content\":\" \"}],\"Images\":[{\"content\":\" \",\"alt\":\" \"}]}]}";
                var s = JsonConvert.DeserializeObject<Section>(json);
                //If you want to set Employee.Sections with json data,try this
                Employee e = new Employee { Sections = new List<Section> { s } };
    

    Models(change class name Sections to Section,Interests to Interest):

    public class Employee
        {
    
            public string Name { get; set; }
    
            [Column(TypeName = "jsonb")]
            public List<Section> Sections { get; set; }
    
        }
    
        public class Section
        {
    
            public string Booking { get; set; }
    
    
            [Column(TypeName = "jsonb")]
            public List<Interest> Interests { get; set; }
    
        }
    
        public class Interest
        {
    
            public string Title { get; set; }
    
            public List<Meta> Meta { get; set; }
    
    
            public List<WithAlt> Images { get; set; }
        }
    
        public class Meta
        {
    
            public string Type { get; set; }
    
            public string Content { get; set; }
    
        }
    
        public class WithAlt
        {
    
            public string content { get; set; }
    
            public string Alt { get; set; }
    
        }