2009-12-08 27 views
13

Tôi có cấu trúc dữ liệu được lưu trữ ở định dạng JSON, được chuyển đổi bằng chức năng serializeJSON. Vấn đề tôi đang gặp phải là các chuỗi có thể là boolean trong CF chẳng hạn như Yes, No, True và False được chuyển thành JSON dưới dạng các giá trị boolean. Dưới đây là mã ví dụ. Bất kỳ ý tưởng về cách ngăn chặn điều này?Làm cách nào để ngăn không cho SerializeJSON thay đổi các chuỗi Có/Không/Đúng/Sai thành boolean?

Code:

<cfset test = {str='Yes'}> 
<cfset json = serializeJSON(test)> 
<cfset fromJSON = deserializeJSON(json)> 

<cfoutput> 
    #test.str#<br> 
    #json#<br> 
    #fromJSON.str# 
</cfoutput> 

Kết quả:

Yes 
{"STR":true} 
YES 
+2

Tôi vừa mới đưa ra giải pháp. Việc thêm một khoảng trống thừa trong chuỗi là một cách để ngăn không cho nó được chuyển đổi thành boolean. Điều này làm việc cho nhu cầu hiện tại của tôi nhưng bất kỳ giải pháp tốt hơn sẽ được đánh giá cao vì vậy tôi không phải thao tác chuỗi trước khi chuyển đổi. –

+0

Có cùng một vấn đề ngay cả khi tôi tự tạo JSON mà không sử dụng serializeJSON() –

Trả lời

4

Thêm khoảng trống thừa vào chuỗi để ngăn không cho chuyển đổi thành boolean, sau đó cắt ở giai đoạn sau.

4

Tôi tin rằng tương tự như "chuỗi buộc" workaround bất kỳ của bạn hoặc là cách duy nhất có thể để ngăn chặn hành vi như vậy trong Adobe CF cho bây giờ.

BTW, Railo hoạt động như mong đợi với ví dụ của bạn. Đây là kết quả đầu ra:

Yes 
{"STR":"Yes"} 
Yes 

Nó cũng hoạt động theo cách tương tự cho các số có dấu 0.

+0

Hiện tại chúng tôi đang sử dụng CF8. Bạn có biết làm thế nào nó được chuyển đổi trong CF9? –

+1

@Dan Biết nền tảng của hỗ trợ mã kế thừa của Adobe, tôi có thể đặt cược rằng hành vi mặc định chưa thay đổi. Nhưng tôi đã kiểm tra nó cho bạn: không có thay đổi. Ngoài ra, các chương trình thủ công cho thấy không có đối số mới nào có thể ghi đè nó: http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-79fa.html – Sergii

+1

Trong CF9,0,0,251028, đó là { "STR": true} – Leigh

-2

Tôi sẽ thử dùng nó: key = javacast("string", "yes"). Điều đó sẽ buộc CF nhận ra nó như là một chuỗi chứ không phải là một boolean.

+1

không thay đổi kết quả trong thử nghiệm của tôi –

+0

Không hoạt động ... tuy nhiên, JavaCast rất hữu ích để đảm bảo số là int và không nổi. – Redtopia

1

nó hacky, nhưng nếu bạn có điều kiện đầu ra có và không là "_yes_" và "_no_" (sử dụng một câu lệnh switch rồi sau serialising JSON thành một chuỗi, thực hiện tìm kiếm và thay thế, nó hoạt động.

raw_json=serializeJSON(object); 
raw_json=ReplaceNoCase(raw_json,':"_Yes_"',':"Yes"',"ALL"); 
raw_json=ReplaceNoCase(raw_json,':"_No_"',':"No"',"ALL"); 

ít nhất CF là consistantly bực bội với điều này, đúng & sai được chuyển đổi để có không khi bạn khứ hồi dữ liệu

0

tôi biết câu trả lời wou này Tôi không làm việc khi câu hỏi được hỏi, nhưng vì đây dường như là câu hỏi mà mọi người đang tìm kiếm khi nghiên cứu vấn đề này, tôi nghĩ sẽ tốt hơn khi cập nhật với bản sửa lỗi mới.

Đối với những người trên CF2016, Adobe đã triển khai new function để giúp khắc phục sự cố này. Điều này sẽ là thích hợp hơn để thêm một không gian vào mặt trước của chuỗi, mặc dù đó vẫn sẽ cần phải được làm việc xung quanh cho bản phát hành trước khi CF2016 như được mô tả bởi Sergii.

For Structs in CF2016:

Sử dụng chức năng struct, setMetadata, để xác định các siêu dữ liệu.

Siêu dữ liệu là cấu trúc trong đó mỗi khóa là khóa cấu trúc và giá trị của mỗi khóa chỉ định thông tin về cách tuần tự hóa trong JSON.

Giá trị của khóa có thể là chuỗi hoặc cấu trúc.

Giá trị dưới dạng chuỗi

metadata = {firstname: "string"}};

Giá trị dưới dạng cấu trúc

siêu dữ liệu = {firstname: {type: "string"}};

Ví dụ:

<cfscript> 
 
     example = structnew(); 
 
     example.firstname = "Yes"; 
 
     example.lastname = "Man"; 
 
     // changing the default serialization by specifying the type of "firstname" as string 
 
     metadata = {firstname: {type:"string"}}; 
 
     example.setMetadata(metadata); 
 
     writeoutput(SerializeJSON(example)); 
 
</cfscript>

Đối với truy vấn trong CF11 +: Adobe thông báo rằng họ đã cố định this issue.

+0

Điều gì sẽ xảy ra khi dữ liệu của tôi đến từ một bản lưu trữ? Tôi đang gặp vấn đề này bằng cách sử dụng cfstoredproc. Bản thân SP sẽ trả về các chuỗi thích hợp, nhưng khi nó lọc qua thẻ cfstoredproc, nó được thay đổi. –

+0

@ReverendDovie theo Adobe, CF11 trở lên đã khắc phục vấn đề này cho các truy vấn mà không cần mã bổ sung miễn là bạn chuyển đổi truy vấn thẳng sang JSON – kuhl

+0

Ngoại trừ việc nó đang làm việc đó với tôi. Tôi đang ở CF2016 và tôi đã sử dụng cfstoredproc để chạy SP. Tôi xác minh trong SQL phát triển rằng SP trả về "Có" nhưng tôi đã đổ dữ liệu ngay sau thẻ cfstoredproc và nó được đặt lại thành true. –

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