Phân tích cú pháp JSON bằng C [đã đóng]


82

Tôi đang cố gắng tìm một cách tốt để phân tích cú pháp JSON trong C. Tôi thực sự không cần một thư viện khổng lồ hay bất cứ thứ gì, tôi muốn có một thứ gì đó nhỏ và nhẹ với các tính năng tối thiểu, nhưng tài liệu tốt.

Có ai có bất cứ điều gì họ có thể chỉ cho tôi?


5
Bạn đang sử dụng một bản phân phối linux?
Nick,


Thư việnjective-c có hoạt động không? Tôi sử dụng TouchJson trên máy mac của mình khi ở obj-c, nó rất dễ sử dụng và nhỏ.
Nick,

Khi bạn nói "mức tối thiểu", bạn có thể thực sự đi đến mức nào? Một số sẽ xử lý mã hóa Unicode khác nhau, một số chỉ UTF-8, và một số chú ý chỉ có các ký tự ASCII "định dạng ký tự" như {, [, ], }, ,, ", và dấu chéo ngược. Họ có thể tùy ý bạn chuyển chuỗi thoát Unicode, họ có thể để bạn kiểm tra xem các số có nằm trong phạm vi Unicode cho phép hay không, v.v. Sau đó, có sự khác biệt lớn giữa phân tích cú pháp JSON tùy ý thành cây so với JSON đã biết thành C cấu trúc.
hippietrail,

Câu trả lời:


73

Json không phải là một ngôn ngữ lớn để bắt đầu, vì vậy các thư viện cho nó có thể sẽ nhỏ (ít nhất là hơn các thư viện Xml).

Có rất nhiều thư viện C được liên kết tại Json.org . Có thể một trong số chúng sẽ hoạt động tốt cho bạn.


3
Vâng, cảm ơn vì câu trả lời! Tôi đã xem qua một loạt chúng và chúng được ghi chép / bảo trì khá kém. Tôi nghĩ tôi sẽ cố gắng ở đây trước khi tôi trải qua tích hợp một .... :)
dshipper

2
@dshipper: sourceforge.net/projects/cjson có vẻ hơi hứa hẹn, tùy theo yêu cầu của bạn. Cá nhân tôi chưa sử dụng bất kỳ thư viện nào trong số này, vì vậy tôi không thể giới thiệu một thư viện. Gợi ý cho một thư viện duy nhất chỉ có một ý kiến, dù sao đi nữa, và không phải là một câu trả lời dứt khoát :)
Merlyn Morgan-Graham

5
@dshipper: Tôi đã có những trải nghiệm tốt với jansson, nó nhẹ và được ghi chép đầy đủ. digip.org/jansson/doc/2.1
Dietrich EPP

1
@Dietrich, thợ may: Tôi vừa mới nhìn Jansson. Tôi đồng ý rằng nó được ghi chép đầy đủ và khá nhỏ, và có vẻ như nó có một bộ thử nghiệm tốt. Nó có thể sẽ phù hợp với yêu cầu của bạn. Nhưng có lẽ có một số thư viện có thể hoạt động. Tôi muốn khuyên bạn nên trừu tượng phụ thuộc Json của bạn một cách tốt nhất bạn có thể, hãy thử một vài thư viện và xem những cung cấp cho bạn đau buồn nhất :)
Merlyn Morgan-Graham

Vì vậy, @dshipper, bạn đã truy cập sourceforge.net/projects/cjson hay gì?
Mawg nói hãy phục hồi Monica vào

37

cJSON có một API khá và nhỏ (2 tệp, ~ 700 dòng). Nhiều trình phân tích cú pháp JSON khác mà tôi đã xem lúc đầu rất lớn ... Tôi chỉ muốn phân tích một số JSON.

Chỉnh sửa: Chúng tôi đã thực hiện một số cải tiến đối với cJSON trong những năm qua.


10

Jsmn khá tối giản và chỉ có hai chức năng để làm việc.

http://zserge.bitbucket.org/jsmn.html


Một nhược điểm với jsmn là nó không xử lý các chuỗi thoát Unicode. Trong nguồn của nó, bạn sẽ thấy: /* Allows escaped symbol \uXXXX */... case 'u':.../* TODO */
hippietrail

14
Ngoài ra, tất cả những gì nó làm là cung cấp cho bạn mã thông báo, chúc bạn may mắn khi tạo ra bất kỳ ý nghĩa nào về dữ liệu. Nó trông giống như điều nhỏ nhất và hiệu quả tuyệt đối mà bạn có thể làm, nhưng nó cũng không làm được gì nhiều.
NateS

Rõ ràng họ đã sửa lỗi "TODO" của họ cho các ký hiệu Unicode.
aviggiano

9

NXJSON là trình phân tích cú pháp JSON đầy đủ tính năng nhưng rất nhỏ (~ 400 dòng mã), có API dễ sử dụng:

const nx_json* json=nx_json_parse_utf8(code);
printf("hello=%s\n", nx_json_get(json, "hello")->text_value);
const nx_json* arr=nx_json_get(json, "my-array");
int i;
for (i=0; i<arr->length; i++) {
  const nx_json* item=nx_json_item(arr, i);
  printf("arr[%d]=(%d) %ld\n", i, (int)item->type, item->int_value);
}
nx_json_free(json);

Có vẻ như bạn là nhà phát triển của NXJSON, có thể bạn có thể nhận xét về cách nó so sánh với cJSON hoặc các tùy chọn khác?
Matt,

5
Mọi thứ đơn giản được thực hiện theo cách đơn giản - đây là điểm khác biệt chính của NXJSON so với hầu hết các trình phân tích cú pháp khác. cJSON cũng đơn giản, nhưng ngoài trình phân tích cú pháp json, nó còn bao gồm hàm tạo json cũng như bộ nối tiếp. cJSON cần thêm bộ nhớ vì nó sao chép tất cả các chuỗi, trong khi NXJSON thực hiện tất cả các thao tác tại chỗ để hủy nội dung gốc. Tùy thuộc vào nhiệm vụ của bạn, những khác biệt này có thể được coi là lợi thế hoặc bất lợi. NXJSON cũng xử lý các bình luận, rất tốt cho việc phân tích cú pháp các tệp cấu hình.
Yaroslav Stavnichiy

9

Bạn có thể xem qua Jansson

Trang web tuyên bố như sau: Jansson là một thư viện C để mã hóa, giải mã và xử lý dữ liệu JSON. Nó có tính năng:

  • Mô hình dữ liệu và API đơn giản và trực quan
  • Có thể vừa mã hóa vừa giải mã từ JSON
  • Tài liệu toàn diện
  • Không phụ thuộc vào các thư viện khác
  • Hỗ trợ đầy đủ Unicode (UTF-8)
  • Bộ thử nghiệm mở rộng

1
Liên kết Github trực tiếp: github.com/akheron/jansson
Ray Hulha

Tôi đã muốn sử dụng jsmnvì tốc độ của nó [1], nhưng nó không hỗ trợ mã hóa. Hơn nữa Jansson thực sự rất dễ sử dụng. --- [1] translate.google.it/…
Marco Sulla

OjC nhanh và hỗ trợ mã hóa. github.com/ohler55/ojc
Peter Ohler

Jansson là đi của tôi để cho phân tích cú pháp JSON trong C
Kenneth Wilke

8

Tôi đã sử dụng JSON-C cho một dự án công việc và muốn giới thiệu nó. Nhẹ và được phát hành với giấy phép mở.

Tài liệu được bao gồm trong bản phân phối. Về cơ bản, bạn có các *_addhàm để tạo các đối tượng JSON, các *_puthàm tương đương để giải phóng bộ nhớ của chúng và các hàm tiện ích chuyển đổi kiểu và xuất đối tượng trong biểu diễn chuỗi.

Việc cấp phép cho phép đưa vào dự án của bạn. Chúng tôi đã sử dụng nó theo cách này, biên dịch JSON-C như một thư viện tĩnh được liên kết với bản dựng chính. Bằng cách đó, chúng tôi không phải lo lắng về các phụ thuộc (ngoài việc cài đặt Xcode).

JSON-C cũng được xây dựng cho chúng tôi theo OS X (x86 Intel) và Linux (x86 Intel) mà không xảy ra sự cố. Nếu dự án của bạn cần phải có tính di động, đây là một khởi đầu tốt.


6

Bạn có cần phân tích cú pháp các cấu trúc JSON tùy ý hay chỉ dữ liệu cụ thể cho ứng dụng của bạn. Nếu sau này, bạn có thể làm cho nó nhẹ hơn và hiệu quả hơn rất nhiều bằng cách không phải tạo bất kỳ bảng băm / cấu trúc bản đồ nào ánh xạ các khóa JSON tới các giá trị; thay vào đó, bạn có thể chỉ cần lưu trữ dữ liệu trực tiếp vào các trường cấu trúc hoặc bất cứ thứ gì.


2
Đây là một điểm rất quan trọng khi sử dụng JSON với các ngôn ngữ không động như C. Nhưng nó không phải là một câu trả lời vì vậy thực sự nên là một nhận xét cho câu hỏi của OP.
hippietrail,

+1 cho tư duy sáng tạo! Nó sẽ hoạt động như thế nào? Điều này vẫn không thể sử dụng một thư viện đặc biệt nhẹ? Phân tích cú pháp vào các trường cấu trúc nghe có vẻ là một công việc khá đơn giản.
CL22
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.