2011-08-31 34 views
30

Tôi đang sử dụng C# trong ứng dụng bảng điều khiển và tôi cần một cách nhanh chóng để kiểm tra xem chuỗi được trả về từ một dịch vụ khác là XML hay JSON.Cách để nhanh chóng kiểm tra xem chuỗi là XML hay JSON trong C#

Tôi biết nếu đó chỉ là XML, tôi có thể kiểm tra nó đối với một lược đồ, hoặc nếu nó chỉ là JSON tôi có thể thử phân tích nó với JSON.Net, nhưng có cách nhanh hơn - có thể sử dụng xây dựng trong .Net chức năng - chỉ để nói đó là trước khi sau đó tiếp tục xử lý nó?

+0

Bạn có quan tâm đến việc xử lý lỗi nếu không phải không? –

+0

Không có dịch vụ nào trả lại dữ liệu sẽ luôn trả về một hoặc khác. – finoutlook

+0

Đối với JSON, hãy xem [Cách đảm bảo chuỗi đó là JSON hợp lệ bằng JSON.NET] (http: // stackoverflow.com/a/14977915) –

Trả lời

47

Rất đơn giản:

  1. hợp lệ JSON luôn luôn bắt đầu với '{' hoặc '['
  2. XML hợp lệ bắt đầu luôn với '<'

Tôi đang nói về không gian dữ liệu.

+0

Nghe hay, trừ khi có ai có thể chỉ ra bất kỳ ngoại lệ nào? – finoutlook

+1

@finoutlook - chỉ cần xem thông số kỹ thuật. Đối với JSON, nó được tuyên bố rõ ràng rằng JSON hợp lệ bắt đầu bằng một trong hai ký tự này và cho XML - bạn có thể đọc các đặc tả ngữ pháp chính thức. Bạn sẽ thấy rằng nó phải bắt đầu bằng '<' ... – Artyom

+0

Vâng tôi phải tin tưởng một phản hồi hợp lệ của nó từ máy chủ, vì vậy bạn nói đúng, nó sẽ đáp ứng chính xác thông số. – finoutlook

27
public static bool IsJson(this string input){ 
    input = input.Trim(); 
    return input.StartsWith("{") && input.EndsWith("}") 
      || input.StartsWith("[") && input.EndsWith("]"); 
} 

đó là một chút bẩn nhưng đơn giản và nhanh chóng

Đó là về cơ bản đủ để kiểm tra ký tự đầu tiên. Thử nghiệm cuối cùng là một cách rất thô lỗ của thử nghiệm hình thành tốt. Nó không đảm bảo nó chỉ đơn giản là nâng cao cơ hội mà nó được hình thành tốt.

Nếu bạn muốn có một phiên bản mạnh mẽ hơn, bạn có thể tận dụng lợi thế của việc đoản mạch nếu chỉ đánh giá tính đúng đắn nếu kiểm tra ban đầu là tốt. Mã dưới đây dựa trên JSON.net

public static bool IsJson(this string input){ 
    input = input.Trim(); 
    Predicate IsWellFormed =() => { 
      try { 
       JToken.Parse(input); 
      } catch { 
       return false; 
      } 
      return true; 
    } 
    return (input.StartsWith("{") && input.EndsWith("}") 
      || input.StartsWith("[") && input.EndsWith("]")) 
      && IsWellFormed() 
} 
+1

Tôi đã đi với một cái gì đó tương tự, nhưng chỉ kiểm tra sự bắt đầu của chuỗi - vì vậy chỉ 'TrimStart()' và 'StartsWith()' – finoutlook

2

nghĩ rằng tôi muốn vứt giải pháp của tôi ở đây quá ...

if (jsonData.Trim().Substring(0, 1).IndexOfAny(new[] {'[', '{'}) != 0) 
    throw new Exception("The source file must be in JSON format"); 

hoặc một phần mở rộng ...

public static bool IsJson(this string jsonData) 
{ 
    return jsonData.Trim().Substring(0, 1).IndexOfAny(new[] { '[', '{' }) == 0; 
} 

sử dụng:

if (!jsonData.IsJson()) 
    throw new Exception("The source file must be in JSON format"); 
+1

thay vì '.Trim(). Chuỗi con (0,1)' bạn chỉ đơn giản là có thể làm ' .Trim() [0] ' –

+0

Không bao giờ ném Ngoại lệ ... ném một loại ngoại lệ có nguồn gốc từ khung công tác hoặc ngoại lệ có nguồn gốc tùy chỉnh của riêng bạn. – nashwan

0

Câu trả lời rất hay nhưng tôi nghĩ tất cả các bạn hoặc quên hết Json. Tôi có ở đây một ví dụ tốt mà các phương pháp của bạn sẽ không bắt và nó sẽ thông qua và ngoại lệ khi trình phân tích cú pháp sẽ cố gắng phân tích cú pháp Json.

{"vị trí": [{"đối tượng": "vị trí", "powerState": "1", "thời gian": "72796", "địa điểm": "1", "clientId": "" ]}

Như bạn có thể thấy, bắt đầu bằng {và kết thúc bằng}, trong tay thứ hai bắt đầu bằng [và kết thúc bằng] nhưng ai đó quên đóng thứ 3 {. Nó tạo ra và lỗi trong Json Parser.

Tôi có thể nói rằng tốt hơn là kiểm tra đầu và cuối cho {[mà chúng tôi tìm thấy. Phương pháp này sẽ an toàn hơn.

Thông thường đó không phải là bình thường nhưng một số người vẫn còn thủ công Json của riêng mình và quên một số phần ... Đừng tin tưởng dữ liệu bên ngoài!

Tôi hy vọng điều đó sẽ hữu ích.

+5

chắc chắn nhưng OP chỉ hỏi về một cách nhanh chóng để quyết định xem đó là XML hay JSON, không phải nếu nó là một chuỗi XML hoặc JSON hợp lệ – WiiMaxx

+1

Phải ... Tôi không nói gì cả ... – ManuVR

+0

OP nói rằng anh ta muốn một cách để kiểm tra nó trước khi xử lý nó. Bạn không thể không nếu nó hợp lệ cho đến khi bạn đã xử lý nó –

Các vấn đề liên quan