Para algunas de mis pruebas unitarias, quiero tener la capacidad de crear valores JSON particulares (álbumes de grabación en este caso) que se puedan usar como entrada para el sistema bajo prueba.
Tengo el siguiente código:
var jsonObject = new JObject();
jsonObject.Add("Date", DateTime.Now);
jsonObject.Add("Album", "Me Against The World");
jsonObject.Add("Year", 1995);
jsonObject.Add("Artist", "2Pac");
Esto funciona bien, pero nunca me ha gustado la sintaxis de la "cadena mágica" y preferiría algo más cercano a la sintaxis de propiedad expando en JavaScript como esta:
jsonObject.Date = DateTime.Now;
jsonObject.Album = "Me Against The World";
jsonObject.Year = 1995;
jsonObject.Artist = "2Pac";
Respuestas:
Bueno, que tal:
dynamic jsonObject = new JObject(); jsonObject.Date = DateTime.Now; jsonObject.Album = "Me Against the world"; jsonObject.Year = 1995; jsonObject.Artist = "2Pac";
fuente
dynamic
.dynamic jsonExpando = new ExpandoObject();
y agregar una línea después de su código:JObject jsonObject = JObject.FromObject(jsonExpando);
jsonObject.list = JToken.FromObject(mylist);
.Puede utilizar la
JObject.Parse
operación y simplemente proporcionar texto JSON delimitado por comillas simples.JObject o = JObject.Parse(@"{ 'CPU': 'Intel', 'Drives': [ 'DVD read/writer', '500 gigabyte hard drive' ] }");
Esto tiene la ventaja de ser JSON, por lo que se lee como JSON.
O tiene datos de prueba que son dinámicos, puede utilizar la
JObject.FromObject
operación y proporcionar un objeto en línea.JObject o = JObject.FromObject(new { channel = new { title = "James Newton-King", link = "http://james.newtonking.com", description = "James Newton-King's blog.", item = from p in posts orderby p.Title select new { title = p.Title, description = p.Description, link = p.Link, category = p.Categories } } });
Documentación de json.net para la serialización
fuente
JObject.FromObject
que no funcionará si hay propiedades con caracteres especiales como-
.Ni
dynamic
, ni laJObject.FromObject
solución funciona cuando tiene propiedades JSON que no son nombres de variable C # válidos, por ejemplo"@odata.etag"
. Prefiero la sintaxis del inicializador del indexador en mis casos de prueba:JObject jsonObject = new JObject { ["Date"] = DateTime.Now, ["Album"] = "Me Against The World", ["Year"] = 1995, ["Artist"] = "2Pac" };
Tener un conjunto separado de símbolos adjuntos para inicializar
JObject
y agregar propiedades hace que los inicializadores de índice sean más legibles que los inicializadores de objetos clásicos, especialmente en el caso de objetos JSON compuestos como se muestra a continuación:JObject jsonObject = new JObject { ["Date"] = DateTime.Now, ["Album"] = "Me Against The World", ["Year"] = 1995, ["Artist"] = new JObject { ["Name"] = "2Pac", ["Age"] = 28 } };
Con la sintaxis del inicializador de objetos, la inicialización anterior sería:
JObject jsonObject = new JObject { { "Date", DateTime.Now }, { "Album", "Me Against The World" }, { "Year", 1995 }, { "Artist", new JObject { { "Name", "2Pac" }, { "Age", 28 } } } };
fuente
Hay algunos entornos en los que no puede usar dinámicos (por ejemplo, Xamarin.iOS) o casos en los que solo busca una alternativa a las respuestas válidas anteriores.
En estos casos puedes hacer:
using Newtonsoft.Json.Linq; JObject jsonObject = new JObject( new JProperty("Date", DateTime.Now), new JProperty("Album", "Me Against The World"), new JProperty("Year", "James 2Pac-King's blog."), new JProperty("Artist", "2Pac") )
Más documentación aquí: http://www.newtonsoft.com/json/help/html/CreatingLINQtoJSON.htm
fuente
Manera simple de crear newtonsoft JObject desde Propiedades.
Esta es una muestra de propiedades de usuario
public class User { public string Name; public string MobileNo; public string Address; }
y quiero que esta propiedad en newtonsoft JObject sea:
JObject obj = JObject.FromObject(new User() { Name = "Manjunath", MobileNo = "9876543210", Address = "Mumbai, Maharashtra, India", });
La salida será así:
{"Name":"Manjunath","MobileNo":"9876543210","Address":"Mumbai, Maharashtra, India"}
fuente
Tarde o temprano tendrás una propiedad con carácter especial. Puede utilizar índice o una combinación de índice y propiedad.
dynamic jsonObject = new JObject(); jsonObject["Create-Date"] = DateTime.Now; //<-Index use jsonObject.Album = "Me Against the world"; //<- Property use jsonObject["Create-Year"] = 1995; //<-Index use jsonObject.Artist = "2Pac"; //<-Property use
fuente
Puede usar la biblioteca Newtonsoft y usarla de la siguiente manera
using Newtonsoft.Json; public class jb { public DateTime Date { set; get; } public string Artist { set; get; } public int Year { set; get; } public string album { set; get; } } var jsonObject = new jb(); jsonObject.Date = DateTime.Now; jsonObject.Album = "Me Against The World"; jsonObject.Year = 1995; jsonObject.Artist = "2Pac"; System.Web.Script.Serialization.JavaScriptSerializer oSerializer = new System.Web.Script.Serialization.JavaScriptSerializer(); string sJSON = oSerializer.Serialize(jsonObject );
fuente