2017-06-13 87 views
0

我有一个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构造一组适当的类和对象?这对我来说现在非常困惑......

+4

原始属性确实包含一个JSON文件 –

+0

@SirRufo和我怎么构建它以这样的形式,如果我有一个字符串没有可代表的一组类和对象,我可以通过它将其转换为? – User987

+2

您正在屏蔽所有“raw'内部,并将其放在”“内,因此它是一个字符串。 –

回答

3

您可以使用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); 
+1

如果这个json文档是问题中的一个,那么json2csharp会生成更多的类并且不需要这种类型的代码 –

+0

我刚刚使用JObject Parse方法将正确的json形式解析为JObject – hasan

+1

但是您确实**不是**使用原始的json与...“raw”:“{\”Token \“:\”123123 \“,...您的......”raw“:{”Token“:”123123 “,...原始json raw属性的类型是** string **,在你的类型是** object ** - 这会产生巨大的差异 –

3

json2csharp将您的原始属性转换为字符串,因为它无法正确解析带有转义字符的JSON文档。 删除转义字符为了让json2csharp创建正确的尖锐类。

{"body":{"mode":"raw","raw":{"Token":"123123","queryName":"testMethod","dataTestToSEND":{"IDs":["B00448MZUW","B071F7LBN6","B01BBZJZHQ"],"Marketplace":"southAmerica","Region":"West","PricingMethod":0}}},"description":"somedescriptionhere"} 
+4

请解释为什么json文档无效如果一个字符串属性包含一个字符串的值表示一个json字符串吗?是否有任何json字符串属性的限制我从来没有听说过? –

+0

你说得对,这是有效的JSON。我的意思是这不是被json2csharp解释为有效的JSON。我编辑了我的答案,谢谢。 – PMerlet

2

建立一个自定义转换器从字符串属性转换为类型

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与反序列化,系列化活生生的例子

+1

我想你的意思是'DeserializeObject ''var result = JsonConvert.SerializeObject (jsonString);' – Fabio

+0

@Fabio是的......那是在我心中:o) –