6

Tengo un objeto estructurado como JS:JavaScriptSerializer deserializar "colección" objeto como propiedad de objeto no

object.property1 = "some string"; 
object.property2 = "some string"; 
object.property3.property1 = "some string"; 
object.property3.property2 = "some string"; 
object.property3.property2 = "some string"; 

estoy usando JSON.stringify (objeto) para aprobar esta solicitud con ajax. Cuando trato de deserializar esto usando JavaScriptSerializer.Deserialize como un Diccionario recibo el siguiente error:

No se ha definido ningún constructor sin parámetros para el tipo de 'System.String'.

Este mismo proceso funciona para objetos normales sin propiedades de "colección" ... ¡gracias por cualquier ayuda!

Respuesta

9

Es porque el deserializador no sabe cómo manejar el subobjeto. Lo que tiene en JS es la siguiente:

var x = { 
    'property1' : 'string', 
    'property2' : 'string', 
    'property3' : { p1: 'string', p2: 'string', p3: 'string' }, 
}; 

que no tiene un mapa a algo válido en C#:

HashTable h = new HashTable(); 
h.Add("property1", "string"); 
h.Add("property2", "string"); 
h.Add("property3", ???); 

La ??? es porque no hay ningún tipo definido aquí, entonces, ¿cómo sabría el deserializador qué representa el objeto anónimo en su JS?

Editar

No hay manera de hacer lo que estamos tratando de lograr aquí. Tendrá que escribir su objeto. Por ejemplo, definir su clase de esta manera:

class Foo{ 
    string property1 { get; set; } 
    string property2 { get; set; } 
    Bar property3 { get; set; } // "Bar" would describe your sub-object 
} 

class Bar{ 
    string p1 { get; set; } 
    string p2 { get; set; } 
    string p3 { get; set; } 
} 

... o algo por el estilo.

+0

Esta es una gran elaboración de mi pregunta original ... ¿tiene usted una respuesta? ¡Gracias! – bill

+0

bien, eso tiene sentido y es lo más fácil posible ... ¿Una vez que los he escrito como deserializo todo de nuevo? – bill

+1

No estoy familiarizado con el JavaScriptSerializer, pero supongo que: Foo foo = JavaScriptSerializer.Deserialize (incomingJson); – jvenema

0

Como respuesta más general, en mi caso tuve objetos que parecían:

{ "field1" : "value", "data" : { "foo" : "bar" } } 

Yo tenía originalmente el campo de datos como una cadena cuando debería haber sido un Dictionary<string, string> como se especifica en MSDN para objetos que usan sintaxis de diccionario

public class Message 
{ 
    public string field1 { get; set; } 

    public Dictionary<string, string> data { get; set; } 
} 
Cuestiones relacionadas