Json转换器可以帮助解决可怜的Json约定问题

时间:2011-05-09 22:19:15

标签: json.net

以下是我们输入JSON的示例:

“书籍”:{       “6”:{         “名字”:“有些书”       },       “7”:{        “名字”:“其他一些书”       }     }

在一个完美的世界里,api(我无法改变)会改为:

“书籍”:[       {         “ID”:“6”,         “名字”:“有些书”       },       {        “ID”:“7”,        “名字”:“其他一些书”       }]

是否可以编写一个JsonConverter,将顶部的例子推到这个:

   [DataContract]
public class Book
{
    [DataMember(Name = "ID")]
    public int ID { get; set; }

    [DataMember(Name = "Name")]
    public string Name { get; set; }
}

由于

}

2 个答案:

答案 0 :(得分:1)

不幸的是,它只是没有格式良好的JSON将抛出任何处理JSON的库。大括号总是以相同的方式解释,所以除非比我更了解JSON的人有更好的想法,否则我认为最好的办法是做一些手动处理。

如果错误格式化是一致的,那么您可以使用正则表达式用方括号替换错误放置的花括号,然后解析它是格式良好的JSON。

祝你好运!

答案 1 :(得分:0)

如果输入文档的结构定义相当严格,您可以尝试更正文档以便解析,然后将文档翻译成您的格式。

// reference Newtonsoft.Json.dll
// using Newtonsoft.Json
// using Newtonsoft.Json.Linq

string badJson = "\"Books\": { \"6\": { \"Name\": \"Some book\" }, \"7\": { \"Name\": \"Some other book\" } }";

var source = JObject.Parse(string.Format("{{{0}}}", badJson));

var sb = new StringBuilder();
using (var writer = new JsonTextWriter(new StringWriter(sb)))
{
  writer.Formatting = Newtonsoft.Json.Formatting.None;
  writer.WriteStartObject();
  writer.WritePropertyName("Books");
  writer.WriteStartArray();

  foreach (JToken child in source["Books"])
  {
    JProperty prop = child as JProperty;

    writer.WriteStartObject();
    writer.WritePropertyName("ID");
    writer.WriteValue(prop.Name);
    writer.WritePropertyName("Name");
    writer.WriteValue((string)prop.Value["Name"]);
    writer.WriteEndObject();
  }

  writer.WriteEndArray();
  writer.WriteEndObject();
}

Console.WriteLine(sb.ToString());

此代码生成以下JSON:

{"Books":[{"ID":"6","Name":"Some book"},{"ID":"7","Name":"Some other book"}]}