【问题标题】:API returns json containing linebreaks etc. how can i clean my json?API 返回包含换行符等的 json。我怎样才能清理我的 json?
【发布时间】:2019-11-26 20:41:37
【问题描述】:

我正在尝试与 api (isbndb.com) 交谈,并且我可以成功获得响应。使用流式阅读器我什至可以得到一个包含 json 的字符串。但是,该字符串还将包含用于换行符等的特殊字符。 因此我无法反序列化 json。字符串内容如下所示:

"{\n    \"book\":\n                         \n                        {\n                                    \"publisher\":\"Pearson\",\n                                                                    \"language\":\"Eng\",\n                                                                                    \"image\":\"https:\\/\\/images.isbndb.com\\/covers\\/34\\/13\\/9780134093413.jpg\",\n                                                    \"title_long\":\"Campbell Biology (11th Edition)\",\n                                                    \"edition\":\"11\",\n                                                                    \"pages\":1488,\n                                                    \"date_published\":\"2017\",\n                                                                    \"subjects\":[\"Biology\"],\n                                                    \"authors\":[\"Lisa A. Urry\",\"Michael L. Cain\",\"Steven A. Wasserman\",\"Peter V. Minorsky\",\"Jane B. Reece\"],\n                                                    \"title\":\"Campbell Biology (11th Edition)\",\n                                                    \"isbn13\":\"9780134093413\",\n                                                    \"msrp\":\"259.99\",\n                                                    \"binding\":\"Hardcover\",\n                                                    \"publish_date\":\"2017\",\n                            \n                            \n                                    \"isbn\":\"0134093410\"\n                            }\n                    }"

让我得到这个结果的方法如下所示:

public bool TryGetBook(string isbn)
        {
            bool rtnValue = false;

            string WEBSERVICE_URL = Globals.WEBSERVICE_URL + isbn;

            try
            {
                var webRequest = WebRequest.Create(WEBSERVICE_URL);

                if (webRequest != null)
                {
                    webRequest.Method = "GET";
                    webRequest.ContentType = "application/json";
                    webRequest.Headers["Authorization"] = Globals.REST_KEY;

                    //Get the response 
                    WebResponse wr = webRequest.GetResponseAsync().Result;
                    Stream receiveStream = wr.GetResponseStream();
                    StreamReader reader = new StreamReader(receiveStream);

                    string content = reader.ReadToEnd();

                    if (content != null)
                    {
                        Book book = JsonConvert.DeserializeObject<Book>(content);

                        if (book != null)
                        {
                            Books.Add(book);
                            rtnValue = true;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
            }
            return rtnValue;
        }

我不太确定在这里做什么,我可以编写一个正则表达式来清理我的示例数据,但这似乎是错误的做法。

非常感谢任何帮助。

【问题讨论】:

  • 您可以简单地替换换行符。顺便说一句,您遇到了哪个错误?
  • 没有错误,我的 Book 对象的每个值都为 null。
  • @ThorGiversen 如果你的书的数量是预期的,那么你应该检查一下我认为的其他地方
  • @ThorGiversen Replace("\n", "") 正在工作,请检查我的答案。另外,Book 对象是嵌套的,你应该正确反序列化它

标签: c# json rest webrequest


【解决方案1】:

您可以使用以下sn-p替换所有换行符

string content = json.Replace("\n", "");

Environment.NewLine 在这里不起作用。下面有一段格式化的内容

{
    "book": 
    {
        "publisher": "Pearson",
        "language": "Eng",
        "image": "https:\/\/images.isbndb.com\/covers\/34\/13\/9780134093413.jpg",
        "title_long": "Campbell Biology (11th Edition)",
        "edition": "11",
        "pages": 1488,
        "date_published": "2017",
        "subjects": ["Biology"],
        "authors": ["Lisa A. Urry", "Michael L. Cain", "Steven A. Wasserman", "Peter V. Minorsky", "Jane B. Reece"],
        "title": "Campbell Biology (11th Edition)",
        "isbn13": "9780134093413",
        "msrp": "259.99",
        "binding": "Hardcover",
        "publish_date": "2017",
        "isbn": "0134093410"
    }
}

然后复制更新的字符串并使用 Edit-Paste Special-Paste JSON as classes。有生成的类

public class BookResponse
{
    public Book book { get; set; }
}

public class Book
{
    public string publisher { get; set; }
    public string language { get; set; }
    public string image { get; set; }
    public string title_long { get; set; }
    public string edition { get; set; }
    public int pages { get; set; }
    public string date_published { get; set; }
    public string[] subjects { get; set; }
    public string[] authors { get; set; }
    public string title { get; set; }
    public string isbn13 { get; set; }
    public string msrp { get; set; }
    public string binding { get; set; }
    public string publish_date { get; set; }
    public string isbn { get; set; }
}

实际上,Book 实例嵌套在不同的类中。所以,为了解析你必须使用类似的东西

var response = JsonConvert.DeserializeObject<BookResponse>(content);

if (response.book != null)
{
}

【讨论】:

    【解决方案2】:

    您可以先尝试用空字符串替换换行符。 content = content.Replace("\\n",""); 然后反序列化。祝你好运。

    【讨论】:

    • 不走运,据我所知,这根本不会改变字符串的内容。不知道为什么。
    • 它是不可变的。这就是我重新影响content 的原因。你至少试过了吗?
    • 您需要转义斜线本身。试试content = content.Replace("\\n", "");(注意两个斜线而不是一个)。
    • @ThorGiversen 您必须将结果分配给字符串。由于字符串是不可变的,因此您无法更改它们。你必须创造新的。所以你必须包含content = 部分
    • 当我尝试时-> var newcontent = content.Replace("\\n", "");什么都没有发生......当我这样做时 var result = Regex.Replace(content, @"\r\n?|\n", "");我可以删除“n”,但不能删除反斜杠。
    猜你喜欢
    • 1970-01-01
    • 2016-05-10
    • 2020-09-24
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    相关资源
    最近更新 更多