【问题标题】:Converting JSON into C# object classses将 JSON 转换为 C# 对象类
【发布时间】:2017-06-13 09:04:14
【问题描述】:

我有一个 JSON,它基本上看起来像这样:

{
    "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 文档的字符串
  • @SirRufo,如果我没有可以将其转换为的可表示的类和对象集,我应该如何以这种形式构造它?
  • 你将raw中的所有“”都隐藏起来,并将其包含在“”中,所以它是一个字符串。
  • 请通过任何在线验证器检查您的 JSON 字符串。看来您有问题('a' 和右括号)。然后尝试使用任何反序列化工具对其进行反序列化。

标签: c# asp.net json asp.net-mvc c#-4.0


【解决方案1】:

您可以使用JSON.NET 将您的json 转换为特定的类

官网: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
  • 但是您确实没有使用问题中的原始 json ..."raw": "{\"Token\" : \"123123\",.. . yours ..."raw":{"Token":"123123",... 在原始 json 中,原始属性的类型是 string,而你的原始属性是 object - 这将产生巨大的影响
  • 你可以看到使用原始json字符串时得到的结果=> dotnetfiddle.net/M20GJe
  • @SirRufo 感谢您提供信息。我已经更新了我的答案
【解决方案2】:

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。我编辑了我的答案。谢谢。
【解决方案3】:

构建自定义转换器以将字符串属性转换为类型

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&lt;T&gt; in var result = JsonConvert.SerializeObject&lt;RootObject&gt;( jsonString );
猜你喜欢
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-26
相关资源
最近更新 更多