转换JSON到C#对象classses
我有一个JSON基本上是这样的:转换JSON到C#对象classses
{
"body":
{
"mode": "raw",
"raw": "{
\"Token\" : \"123123\", \"queryName\" : \"testMethod\" ,\"dataTestToSEND\" :{\"IDs\":[\"B00448MZUW\",\"B071F7LBN6\",\"B01BBZJZHQ\"],\"Marketplace\":\"southAmerica\",\"Region\":\"West\",\"PricingMethod\":0}} "a
},
"description": "some description here"
}
}
而且当我把它转换成C#对象类,我得到这个:
public class Body
{
public string mode { get; set; }
public string raw { get; set; }
}
public class RootObject
{
public Body body { get; set; }
public string description { get; set; }
}
我用json2csharp工具这里..
现在,我在这里混淆了我的“原始”属性,你可以看到..该工具将其转换为字符串,但这看起来不像一个字符串给我?
而是原始的,我看到它的样子,应该是包含这样的一个类:
public class Raw
{
public string Token { get; set; }
public string queryName { get; set; }
public List<string//?not sure which type does this needs to be set to?>
dataTestToSEND { get; set }
public string marketplace { get; set; }
public string Region { get; set }
}
有人能帮助我吗?我怎样才能为这个JSON构造一组适当的类和对象?这对我来说现在非常困惑......
您可以使用JSON.NET你的JSON转换为特定的类
官方网站:http:http://www.newtonsoft.com/json
您可以从JSON删除反斜杠让JObject解释。
public class Raw
{
public Raw(string json)
{
JObject jObject = JObject.Parse(json);
JToken jRaw = jObject["raw"];
Token = (string) jRaw["token"];
queryName = (string) jRaw["queryName"];
dataTestToSEND = (List<string>) jRaw["dataTestToSEND"];
marketplace = (string) jRaw["Marketplace"]
Region= jRaw["players"].ToArray();
}
public string Token {get;set;}
public string queryName {get;set;}
public List<string> dataTestToSEND {get;set}
public string marketplace {get;set;}
public string Region{get;set}
}
// Call User with your json
string json = @"{""body"":{""mode"":""raw"",""raw"":{""Token"":""123123"",""queryName"":""testMethod"",""dataTestToSEND"":{""IDs"":[""B00448MZUW"",""B071F7LBN6"",""B01BBZJZHQ""],""Marketplace"":""southAmerica"",""Region"":""West"",""PricingMethod"":""0""}}},""description"":""somedescriptionhere""}";
Raw raw = new Raw(json);
如果这个json文档是问题中的一个,那么json2csharp会生成更多的类并且不需要这种类型的代码 –
我刚刚使用JObject Parse方法将正确的json形式解析为JObject – hasan
但是您确实**不是**使用原始的json与...“raw”:“{\”Token \“:\”123123 \“,...您的......”raw“:{”Token“:”123123 “,...原始json raw属性的类型是** string **,在你的类型是** object ** - 这会产生巨大的差异 –
json2csharp将您的原始属性转换为字符串,因为它无法正确解析带有转义字符的JSON文档。 删除转义字符为了让json2csharp创建正确的尖锐类。
{"body":{"mode":"raw","raw":{"Token":"123123","queryName":"testMethod","dataTestToSEND":{"IDs":["B00448MZUW","B071F7LBN6","B01BBZJZHQ"],"Marketplace":"southAmerica","Region":"West","PricingMethod":0}}},"description":"somedescriptionhere"}
请解释为什么json文档无效如果一个字符串属性包含一个字符串的值表示一个json字符串吗?是否有任何json字符串属性的限制我从来没有听说过? –
你说得对,这是有效的JSON。我的意思是这不是被json2csharp解释为有效的JSON。我编辑了我的答案,谢谢。 – PMerlet
建立一个自定义转换器从字符串属性转换为类型
public class RawConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return true;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType != JsonToken.String)
{
throw new InvalidOperationException();
}
var value = (string)reader.Value;
var obj = JsonConvert.DeserializeObject(value, objectType);
return obj;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var str = JsonConvert.SerializeObject(value);
writer.WriteValue(str);
}
}
,并把属性的财产,你需要一个转换器
public class Body
{
public string mode { get; set; }
// This property is a raw string in the json document
[JsonConverter(typeof(RawConverter))]
public Data raw { get; set; }
}
public class RootObject
{
public Body body { get; set; }
public string description { get; set; }
}
public class Data
{
public string Token { get; set; }
public string queryName { get; set; }
public DataTestToSEND dataTestToSEND { get; set; }
}
public class DataTestToSEND
{
public string[] IDs { get; set; }
public string Marketplace { get; set; }
public string Region { get; set; }
public int PricingMethod { get; set; }
}
,现在你可以反序列化给定的json
{
"body": {
"mode": "raw",
"raw": "{\"Token\":\"123123\",\"queryName\":\"testMethod\",\"dataTestToSEND\":{\"IDs\":[\"B00448MZUW\",\"B071F7LBN6\",\"B01BBZJZHQ\"],\"Marketplace\":\"southAmerica\",\"Region\":\"West\",\"PricingMethod\":0}}"
},
"description": "some description here"
}
与
var result = JsonConvert.DeserializeObject<RootObject>(jsonString);
上.net fiddle与反序列化,系列化活生生的例子
我想你的意思是'DeserializeObject
@Fabio是的......那是在我心中:o) –
原始属性确实包含一个JSON文件 –
@SirRufo和我怎么构建它以这样的形式,如果我有一个字符串没有可代表的一组类和对象,我可以通过它将其转换为? – User987
您正在屏蔽所有“raw'内部,并将其放在”“内,因此它是一个字符串。 –